Получить имена всех файлов из папки с Ruby - PullRequest
317 голосов
/ 18 ноября 2009

Я хочу получить все имена файлов из папки, используя Ruby.

Ответы [ 16 ]

477 голосов
/ 18 ноября 2009

У вас также есть опция быстрого доступа

Dir["/path/to/search/*"]

и если вы хотите найти все файлы Ruby в любой папке или подпапке:

Dir["/path/to/search/**/*.rb"]
154 голосов
/ 18 ноября 2009
Dir.entries(folder)

пример:

Dir.entries(".")

Источник: http://ruby -doc.org / core / classes / Dir.html # method-c-records

87 голосов
/ 20 марта 2013

Следующие фрагменты точно показывают имена файлов внутри каталога, пропуская подкаталоги и ".", ".." пунктирные папки:

Dir.entries("your/folder").select {|f| !File.directory? f}
31 голосов
/ 30 августа 2014

Чтобы получить все файлы (только файлы) рекурсивно:

Dir.glob('path/**/*').select{ |e| File.file? e }

Или все, что не является каталогом (File.file? будет отклонять нестандартные файлы):

Dir.glob('path/**/*').reject{ |e| File.directory? e }

Альтернативное решение

Использование Find#find над методом поиска на основе шаблона, например Dir.glob, на самом деле лучше. См. этот ответ на вопрос «Однострочный в каталогах рекурсивного списка в Ruby?»

12 голосов
/ 02 июля 2016

Это работает для меня:

Если вам не нужны скрытые файлы [1], используйте Dir [] :

# With a relative path, Dir[] will return relative paths 
# as `[ './myfile', ... ]`
#
Dir[ './*' ].select{ |f| File.file? f } 

# Want just the filename?
# as: [ 'myfile', ... ]
#
Dir[ '../*' ].select{ |f| File.file? f }.map{ |f| File.basename f }

# Turn them into absolute paths?
# [ '/path/to/myfile', ... ]
#
Dir[ '../*' ].select{ |f| File.file? f }.map{ |f| File.absolute_path f }

# With an absolute path, Dir[] will return absolute paths:
# as: [ '/home/../home/test/myfile', ... ]
#
Dir[ '/home/../home/test/*' ].select{ |f| File.file? f }

# Need the paths to be canonical?
# as: [ '/home/test/myfile', ... ]
#
Dir[ '/home/../home/test/*' ].select{ |f| File.file? f }.map{ |f| File.expand_path f }

Теперь Dir.entries вернет скрытые файлы, и вам не понадобится подстановочный знак звездочки (вы можете просто передать переменную с именем каталога), но он вернет базовое имя напрямую, функции File.xxx не будут работать.

# In the current working dir:
#
Dir.entries( '.' ).select{ |f| File.file? f }

# In another directory, relative or otherwise, you need to transform the path 
# so it is either absolute, or relative to the current working dir to call File.xxx functions:
#
home = "/home/test"
Dir.entries( home ).select{ |f| File.file? File.join( home, f ) }

[1] .dotfile в Unix, я не знаю о Windows

8 голосов
/ 16 сентября 2015

Это решение для поиска файлов в каталоге:

files = Dir["/work/myfolder/**/*.txt"]

files.each do |file_name|
  if !File.directory? file_name
    puts file_name
    File.open(file_name) do |file|
      file.each_line do |line|
        if line =~ /banco1/
          puts "Found: #{line}"
        end
      end
    end
  end
end
8 голосов
/ 13 мая 2015

Лично я нашел это наиболее полезным для циклического перемещения по файлам в папке, прогноз безопасности:

Dir['/etc/path/*'].each do |file_name|
  next if File.directory? file_name 
end
5 голосов
/ 02 апреля 2018

В Ruby 2.5 теперь можно использовать Dir.children. Он получает имена файлов в виде массива, кроме «.» и ".."

Пример:

Dir.children("testdir")   #=> ["config.h", "main.rb"]

http://ruby -doc.org / ядро-2.5.0 / Dir.html # способ-с-детьми

4 голосов
/ 08 ноября 2015

При получении всех имен файлов в каталоге этот фрагмент можно использовать для отклонения как каталогов [., ..], так и скрытых файлов, которые начинаются с .

files = Dir.entries("your/folder").reject {|f| File.directory?(f) || f[0].include?('.')}
3 голосов
/ 28 августа 2017

Вот что у меня работает:

Dir.entries(dir).select { |f| File.file?(File.join(dir, f)) }

Dir.entries возвращает массив строк. Затем мы должны предоставить полный путь к файлу File.file?, если dir не равен нашему текущему рабочему каталогу. Вот почему это File.join().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...