Как мне получить список папок, которые существуют в определенном каталоге с помощью ruby?
Dir.entries()
похоже, но я не знаю, как ограничиться только папками.
ruby
directory
directory-listing
0xC0DEFACE
источник
источник
'.'
(текущий каталог) и'..'
(родительский каталог). В большинстве случаев вы хотите удалить хотя бы эти два.Dir.entries(root).select { |entry| File.directory? File.join(root, entry) and not entry.in? %w[. ..]}
Dir.glob
.Dir.glob()
в другом ответе - я настоятельно рекомендую просто сделать это вместо этогоЯ нашел это более полезным и простым в использовании:
Dir.chdir('/destination_directory') Dir.glob('*').select {|f| File.directory? f}
он получает все папки в текущем каталоге, исключенные
.
и..
.Для рекурсии папок просто используйте
**
вместо*
.Dir.glob
Линия также может быть передана вDir.chdir
качестве блока:Dir.chdir('/destination directory') do Dir.glob('*').select { |f| File.directory? f } end
источник
**/*
вместо*
.На мой взгляд,
Pathname
он намного лучше подходит для имен файлов, чем для простых строк.require "pathname" Pathname.new(directory_name).children.select { |c| c.directory? }
Это дает вам массив всех каталогов в этом каталоге в виде объектов Pathname.
Если вы хотите иметь струны
Pathname.new(directory_name).children.select { |c| c.directory? }.collect { |p| p.to_s }
Если
directory_name
было абсолютным, эти строки тоже абсолютны.источник
Pathname
том , что он автоматически удаляет.
,..
и proprietery файлы , такие как.DS_Store
Рекурсивно найти все папки в определенном каталоге:
Dir.glob 'certain_directory/**/*/'
Безрекурсивная версия:
Dir.glob 'certain_directory/*/'
Примечание:
Dir.[]
работает вродеDir.glob
.источник
directory = 'Folder' puts Dir.entries(directory).select { |file| File.directory? File.join(directory, file)}
источник
Вы можете использовать
File.directory?
изFileTest
модуля, чтобы узнать, является ли файл каталогом. Сочетание этого сDir.entries
приятным (иш) лайнером:directory = 'some_dir' Dir.entries(directory).select { |file| File.directory?(File.join(directory, file)) }
Изменить: Обновлено в соответствии с исправлением ScottD.
источник
С этим, вы можете получить массив на полный путь к вашим каталогам , подкаталоги , рекурсивно рекурсивным образом. Я использовал этот код, чтобы загрузить эти файлы внутрь
config/application
файла.Dir.glob("path/to/your/dir/**/*").select { |entry| File.directory? entry }
Вдобавок нам не нужно заниматься скучным
.
и..
прочим. Принятый ответ нужно было разобраться с ними.источник
Dir.glob('/your_dir').reject {|e| !File.directory?(e)}
источник
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
источник
Для общего решения вы, вероятно, захотите использовать
Это будет работать с такими путями, как
~/*/
(все папки в вашем домашнем каталоге).источник
Мы можем объединить ответ Borh в и ответ Йоханнеса получить довольно элегантное решение , чтобы получить имена каталогов в папке.
# 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 }
источник
Только папки (исключены "." И ".."):
Dir.glob(File.join(path, "*", File::SEPARATOR))
Папки и файлы:
Dir.glob(File.join(path, "*"))
источник
Я думаю, вы можете протестировать каждый файл, чтобы убедиться, что это каталог с расширением
FileTest.directory? (file_name)
. Дополнительную информацию см. В документации по FileTest .источник