Как получить список только файлов с помощью Dir.glob?
Как я могу вернуть список только файлов, а не каталогов в указанном каталоге?
У меня my_list = Dir.glob(script_path.join("*"))
Это возвращает все в каталоге, включая подкаталоги. Я искал, но не смог найти ответ.
Ответы
Ответ 1
В дополнение к ответу Марка, Dir.entries
вернет каталоги. Если вы просто хотите файлы, вы можете протестировать каждую запись, чтобы увидеть, есть ли файл или каталог, используя file?
.
Dir.entries('/home/theiv').select { |f| File.file?(f) }
Замените /home/theiv
на любой каталог, в который вы хотите искать файлы.
Кроме того, посмотрите File. Он предоставляет множество тестов и свойств, которые вы можете получить о файлах.
Ответ 2
Dir.glob('*').select { |fn| File.file?(fn) }
Ответ 3
Я думаю, что записи не делают спасение. Если вы хотите, чтобы файлы в подкаталогах также использовали
puts Dir['**/*'].select { |f| File.file?(f) }
Ответ 4
Если вы хотите сделать это за один раз вместо того, чтобы сначала создать массив, а затем повторить его с помощью select
, вы можете сделать что-то вроде:
my_list = []
Dir.foreach(dir) { |f| my_list << f if File.file?(f) }
Ответ 5
Вы можете использовать Dir[]
/Dir.glob
или Dir.entries
, чтобы получить список файлов. Разница между ними заключается в том, что первый возвращает полный путь, а последний возвращает только имя файла.
Поэтому будьте осторожны в следующем сегменте отображения .select {|f| File.file?(f)}
: с полным путем он работает хорошо, а при только имени файла он иногда работает проводным.
FYR:
Dir [], Dir.glob, Dir.entries
Ответ 6
Следуя предложению @karl-li в решении @theIV, я нашел, что это хорошо работает:
Dir.entries('path/to/files/folder').reject { |f| File.directory?(f) }
Ответ 7
вы можете просто получить имена файлов с помощью File.basename(file)
Dir.glob(script_path.join("*")).map{ |s| File.basename(s) }
Ответ 8
Похоже, вы ищете Dir.entries
:
Возвращает массив, содержащий все имена файлов в данном каталоге. Поднимет SystemCallError, если именованный каталог не существует.
Если поиск Google для решения этой проблемы не приводит к каким-либо результатам, вы можете просмотреть документацию Ruby.