Jak napisać pętlę w języku ruby, aby móc wykonać blok kodu na każdym pliku?
Jestem nowy w ruby i doszedłem do wniosku, że sposobem na zrobienie tego jest wykonanie każdej pętli.
Plik ruby zostanie wykonany z innego katalogu niż katalog, który chcę zapętlić.
Próbowałem Dir.foreach
i nie mogłem go uruchomić.
ruby
directory
filesystems
Andrzej
źródło
źródło
Dir.foreach
działa w celu iteracji zawartości katalogu, więc dzieje się coś jeszcze.do_something_with(entry) if File.file?(entry)
'img/*.{jpg,png,gif,jpeg}'
do przechwytywania wielu rozszerzeń.Odpowiedzi:
Jak powiedzieli inni,
Dir::foreach
jest tutaj dobrą opcją. Należy jednak pamiętać, żeDir::foreach
iDir::entries
zawsze będzie zawierać.
i..
(katalogi bieżący i nadrzędny). Na ogół nie będziesz chciał nad nimi pracować, więc możesz użyćDir::each_child
lubDir::children
(jak sugeruje ma11hew28 ) lub zrobić coś takiego:Dir::foreach
orazDir::entries
(a takżeDir::each_child
iDir::children
) obejmują również ukryte pliki i katalogi. Często tego właśnie chcesz, ale jeśli tak nie jest, musisz zrobić coś, aby je pominąć.Ewentualnie możesz sprawdzić,
Dir::glob
która zapewnia proste dopasowanie symboli wieloznacznych:źródło
Dir.foreach
jeśli katalog zawiera ogromną liczbę plików!next if File.directory? item
.
lub..
dlatego, że ludzie prawie zawsze chcą je zignorować.Dir.foreach
iteruje zamiast budować (potencjalnie ogromną) tablicę z góry (coDir.glob
robi). Jeśli więc katalog jest naprawdę ogromny, może mieć to wpływ na wydajność. W normalnych okolicznościach nie zauważysz, ale w warunkach stresowych może to mieć absolutnie znaczenie.To moja ulubiona metoda łatwego czytania:
Możesz nawet rozszerzyć to, aby działało na wszystkich plikach w podkatalogach:
źródło
Dir ma również krótszą składnię, aby uzyskać tablicę wszystkich plików z katalogu:
źródło
fname
iteracjach?źródło
Biblioteka wyszukiwania została zaprojektowana specjalnie do tego zadania: https://ruby-doc.org/stdlib-2.5.1/libdoc/find/rdoc/Find.html
Jest to standardowa biblioteka ruby, więc powinna być dostępna
źródło
File.find
schodzi rekurencyjnie tak daleko, jak to możliwe, zaczynając od ścieżki, którą mu podasz. Nie jestem pewien, czy tego chce OP.*.rb
dofind()
Podoba mi się ten, o którym nie wspomniano powyżej.
Zaletą jest to, że zamiast łańcucha otrzymujesz obiekt Pathname, z którym możesz robić użyteczne rzeczy i przechodzić dalej.
źródło
źródło
Dir.foreach
iteruje, jednocześnieDir.entries
budując całą tablicę. Więc jeśli katalog jest ogromny, oznacza to mniejszy hit pamięci. (Prawdopodobnie nie jest to wielka sprawa, ale nadal ...)Aby pominąć
.
&..
, możesz użyćDir::each_child
.Dir::children
zwraca tablicę nazw plików.źródło