Jak uzyskać listę folderów, które istnieją w określonym katalogu z ruby?
Dir.entries()
wygląda blisko, ale nie wiem, jak ograniczyć tylko do folderów.
ruby
directory
directory-listing
0xC0DEFACE
źródło
źródło
'.'
(katalog bieżący) i'..'
(katalog macierzysty bieżącego katalogu). W większości przypadków chcesz usunąć co najmniej te dwa.Dir.entries(root).select { |entry| File.directory? File.join(root, entry) and not entry.in? %w[. ..]}
Dir.glob
.Dir.glob()
co widać w drugiej odpowiedzi - zdecydowanie polecam zrobienie tego zamiast tegoUważam, że to bardziej przydatne i łatwe w użyciu:
Dir.chdir('/destination_directory') Dir.glob('*').select {|f| File.directory? f}
pobiera wszystkie foldery w bieżącym katalogu, wykluczone
.
i..
.Aby powtarzać foldery, po prostu użyj
**
zamiast*
.Dir.glob
Linia może być również przekazywaneDir.chdir
jako blok:Dir.chdir('/destination directory') do Dir.glob('*').select { |f| File.directory? f } end
źródło
**/*
zamiast*
.Moim zdaniem
Pathname
znacznie lepiej nadaje się do nazw plików niż zwykłe ciągi.require "pathname" Pathname.new(directory_name).children.select { |c| c.directory? }
To daje tablicę wszystkich katalogów w tym katalogu jako obiekty Pathname.
Jeśli chcesz mieć struny
Pathname.new(directory_name).children.select { |c| c.directory? }.collect { |p| p.to_s }
Gdyby
directory_name
było absolutne, te ciągi też są absolutne.źródło
Pathname
jest to, że automatycznie usuwa.
,..
a pliki proprietery jak.DS_Store
Rekurencyjnie znajdź wszystkie foldery w określonym katalogu:
Dir.glob 'certain_directory/**/*/'
Wersja nierekurencyjna:
Dir.glob 'certain_directory/*/'
Uwaga:
Dir.[]
działa jakDir.glob
.źródło
directory = 'Folder' puts Dir.entries(directory).select { |file| File.directory? File.join(directory, file)}
źródło
Możesz użyć
File.directory?
zFileTest
modułu, aby dowiedzieć się, czy plik jest katalogiem. Połączenie tego zDir.entries
tworzy fajną (ish) -liner:directory = 'some_dir' Dir.entries(directory).select { |file| File.directory?(File.join(directory, file)) }
Edycja: Zaktualizowano zgodnie z poprawką ScottD.
źródło
Z tym jednym, można uzyskać tablicę z pełną ścieżką do swoich katalogów , podkatalogów , subsubdirectories w rekurencyjnej sposób. Użyłem tego kodu, aby chętnie załadować te pliki do
config/application
pliku.Dir.glob("path/to/your/dir/**/*").select { |entry| File.directory? entry }
Ponadto nie musimy zajmować się nudne
.
i..
już. Zaakceptowana odpowiedź musiała poradzić sobie z nimi.źródło
Dir.glob('/your_dir').reject {|e| !File.directory?(e)}
źródło
reject !
,select
$dir_target = "/Users/david/Movies/Camtasia 2/AzureMobileServices.cmproj/media" Dir.glob("#{$dir_target}/**/*").each do |f| if File.directory?(f) puts "#{f}\n" end end
źródło
Dla ogólnego rozwiązania, którego prawdopodobnie chcesz użyć
Będzie to działać ze ścieżkami takimi jak
~/*/
(wszystkie foldery w twoim katalogu domowym).źródło
Możemy łączyć odpowiedź Borh za i odpowiedzi Johannes' , aby uzyskać dość eleganckie rozwiązanie do coraz nazwy katalogów w folderze.
# user globbing to get a list of directories for a path base_dir_path = '' directory_paths = Dir.glob(File.join(base_dir_path, '*', '')) # or recursive version: directory_paths = Dir.glob(File.join(base_dir_path, '**', '*', '')) # cast to Pathname directories = directory_paths.collect {|path| Pathname.new(path) } # return the basename of the directories directory_names = directories.collect {|dir| dir.basename.to_s }
źródło
Tylko foldery („.” I „..” są wykluczone):
Dir.glob(File.join(path, "*", File::SEPARATOR))
Foldery i pliki:
Dir.glob(File.join(path, "*"))
źródło
Myślę, że możesz przetestować każdy plik, aby sprawdzić, czy jest to katalog z rozszerzeniem
FileTest.directory? (file_name)
. Zobacz dokumentację FileTest, aby uzyskać więcej informacji.źródło