Как получить список папок, которые существуют в определенном каталоге с ruby?
Dir.entries() выглядит близко, но я не знаю, как ограничить только папки.
Как получить список папок, которые существуют в определенном каталоге с ruby?
Dir.entries() выглядит близко, но я не знаю, как ограничить только папки.
Иордания близка, но Dir.entries не возвращает полный путь, который ожидает File.directory?. Попробуйте следующее:
Dir.entries('/your_dir').select {|entry| File.directory? File.join('/your_dir',entry) and !(entry =='.' || entry == '..') }
Я нашел это более полезным и простым в использовании:
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 было абсолютным, эти строки также являются абсолютными.
Рекурсивно найти все папки в определенном каталоге:
Dir.glob 'certain_directory/**/*/'
Нерекурсивная версия:
Dir.glob 'certain_directory/*/'
Примечание: Dir.[] работает как Dir.glob.
Вы можете использовать File.directory? из модуля FileTest, чтобы узнать, является ли файл каталогом. Сочетание этого с Dir.entries делает приятным (ish) -liner:
directory = 'some_dir'
Dir.entries(directory).select { |file| File.directory? File.join(directory, file}
Изменить: Обновлено по коррекции ScottD.
directory = 'Folder'
puts Dir.entries(directory).select { |file| File.directory? File.join(directory, file)}
Dir.glob('/your_dir').reject {|e| !File.directory?(e)}
$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
Для общего решения вы, вероятно, захотите использовать
Dir.glob(File.expand_path(path))
Это будет работать с такими путями, как ~/*/ (все папки в вашем домашнем каталоге).
Только папки ("." И ".." исключаются):
Dir.glob(File.join(path, "*", File::SEPARATOR))
Папки и файлы:
Dir.glob(File.join(path, "*"))
С этим вы можете рекурсивно получить массив полного пути к вашим каталогам, подкаталогам, подкаталогам. Я использовал этот код для загрузки этих файлов в файл config/application.
Dir.glob("path/to/your/dir/**/*").select { |entry| File.directory? entry }
Кроме того, нам не нужно иметь дело со скучным . и .. больше. Принятый ответ должен был иметь дело с ними.
Я думаю, вы можете протестировать каждый файл, чтобы узнать, является ли он каталогом с FileTest.directory? (file_name). Для получения дополнительной информации см. документацию для FileTest.
Мы можем объединить ответ Borh и ответ johannes, чтобы получить довольно элегантное решение для получения каталога имена в папке.
# 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 }