Chcę uzyskać wszystkie nazwy plików z folderu za pomocą Ruby.
358
Masz również opcję skrótu
Dir["/path/to/search/*"]
a jeśli chcesz znaleźć wszystkie pliki Ruby w dowolnym folderze lub podfolderze:
Dir["/path/to/search/**/*.rb"]
./...
zamiast~/
./
oznacza bieżący katalog, podczas gdy/
jest głównym punktem podłączenia i~/
jest katalogiem domowym użytkownika. Jeśli przeniesiesz cały projekt gdzieś indziej, pierwszy zadziała, ale dwa pozostałe prawdopodobnie nie.przykład:
Źródło: http://ruby-doc.org/core/classes/Dir.html#method-c-entries
źródło
Dir#glob
na przykład może być wspomniany), nic nie stoi na przeszkodzie, aby ktoś inny opublikował naprawdę dobrą odpowiedź. „Oczywiście, jestem typem faceta„ na wpół zapełnionego ”…Dir
rzadko i za każdym razem, gdy go potrzebuję, muszę czytać dokumentację. Wysłałem tutaj moje pytanie i odpowiedź, aby móc je później znaleźć, a może nawet pomóc komuś z tym samym pytaniem. Myślę, że słyszałem na SO podcast, że nie ma nic złego w takim zachowaniu. Jeśli masz lepszą odpowiedź, opublikuj ją. Opublikowałem to, co wiem, nie jestem rubinowym ninja. Regularnie przyjmuję odpowiedzi z największą liczbą głosów.Dir[]
lubDir.glob
gdy argumentem jest zmienna. Kiedypath = '/tmp'
, porównaj:Dir.glob("#{path}/*")
vsDir.entries(path)
. Zwracane wartości są nieco inne („.”, „..”), ale te ostatnie można łatwiej sprawdzić na pierwszy rzut oka.Poniższe fragmenty dokładnie pokazuje nazwy plików wewnątrz katalogu, pomijanie i podkatalogów
"."
,".."
przerywanymi folderach:źródło
...select {|f| File.file? f}
dla jaśniejszego znaczenia i krótszej składni.Dir.entries("your/folder").select {|f| File.file? f}
!File.directory?
działa, aleFile.file?
nie..reject {|f| File.directory? f}
wydaje się czystszy niż.select{|f| !File.directory? f}
. Aha, a teraz widzę pierwszy komentarz ... również dobry.Aby rekurencyjnie uzyskać wszystkie pliki (tylko pliki):
Lub coś, co nie jest katalogiem (
File.file?
odrzuciłoby pliki nieregularne):Alternatywne rozwiązanie
Używanie
Find#find
metody wyszukiwania opartej na wzorcach jakDir.glob
jest w rzeczywistości lepsze. Zobacz tę odpowiedź do „Jednowarstwowa lista rekurencyjnie wyświetlająca katalogi w Rubim?” .źródło
To działa dla mnie:
Jeśli nie chcesz ukrytych plików [1], użyj Dir [] :
Teraz Dir.entries zwróci ukryte pliki i nie potrzebujesz wieloznacznej asterix (możesz po prostu przekazać zmienną z nazwą katalogu), ale zwróci ona bezpośrednio basename, więc funkcje File.xxx nie będą działać .
[1]
.dotfile
na Uniksie, nie wiem o Windowsieźródło
W Ruby 2.5 możesz teraz używać
Dir.children
. Pobiera nazwy plików jako tablicę z wyjątkiem „.” i ".."Przykład:
http://ruby-doc.org/core-2.5.0/Dir.html#method-c-children
źródło
Osobiście uważam, że jest to najbardziej przydatne do zapętlania plików w folderze, patrząc w przyszłość:
źródło
To jest rozwiązanie, aby znaleźć pliki w katalogu:
źródło
Podczas uzyskiwania wszystkich nazw plików w katalogu tego fragmentu można użyć do odrzucenia zarówno katalogów [
.
,..
], jak i ukrytych plików, które zaczynają się od.
źródło
Dir.entries
zwraca lokalne nazwy plików, a nie bezwzględne ścieżki plików. Z drugiej stronyFile.directory?
oczekuje bezwzględnej ścieżki do pliku. Ten kod nie działa zgodnie z oczekiwaniami.ten kod zwraca tylko nazwy plików z ich rozszerzeniem (bez ścieżki globalnej)
źródło
Oto, co działa dla mnie:
Dir.entries
zwraca tablicę ciągów. Następnie musimy podać pełną ścieżkę do plikuFile.file?
, chyba żedir
jest równa naszemu bieżącemu katalogowi roboczemu. Dlatego toFile.join()
.źródło
Możesz także użyć
Rake::FileList
(pod warunkiem, że maszrake
zależność):Zgodnie z API:
https://docs.ruby-lang.org/en/2.1.0/Rake/FileList.html
źródło
Jeśli chcesz uzyskać tablicę nazw plików, w tym dowiązania symboliczne , użyj
lub nawet
a jeśli chcesz przejść bez dowiązań symbolicznych , użyj
Jak pokazano w innych odpowiedziach, użyj
Dir.glob('/path/to/dir/**/*')
zamiast,Dir.new('/path/to/dir')
jeśli chcesz uzyskać wszystkie pliki rekurencyjnie.źródło
*.*
źródło
Oprócz sugestii w tym wątku chciałem wspomnieć, że jeśli chcesz również zwrócić pliki kropek (.gitignore itp.), W Dir.glob musisz dołączyć flagę:
Dir.glob("/path/to/dir/*", File::FNM_DOTMATCH)
Domyślnie Dir.entries zawiera pliki kropek, a także bieżące katalogi nadrzędne.Dla każdego zainteresowanego byłem ciekawy, jak tutaj odpowiedzi w porównaniu do siebie w czasie wykonania, oto wyniki przeciwko głęboko zagnieżdżonej hierarchii. Pierwsze trzy wyniki są nierekurencyjne:
Zostały one wygenerowane za pomocą następującego skryptu testowego:
Różnice w liczbie
Dir.entries
plików wynikają z domyślnego uwzględnienia plików ukrytych.Dir.entries
skończyło się to trochę dłużej w tym przypadku z powodu konieczności przebudowania bezwzględnej ścieżki do pliku, aby ustalić, czy plik jest katalogiem, ale nawet bez tego wciąż trwało to dłużej niż inne opcje w przypadku rekurencyjnym. Wszystko to przy użyciu Ruby 2.5.1 na OSX.źródło
Jednym prostym sposobem może być:
źródło
zwraca ścieżki względne pliku z katalogu i wszystkich podkatalogów
źródło
W kontekście IRB możesz użyć następujących poleceń, aby pobrać pliki do bieżącego katalogu:
Możesz sprawić, by działało to również w innych katalogach:
źródło