Как получить список только файлов с помощью 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.