Я хочу получить все имена файлов из папки с помощью Ruby.
Получить имена всех файлов из папки с Ruby
Ответ 1
У вас также есть опция ярлыка
Dir["/path/to/search/*"]
и если вы хотите найти все файлы Ruby в любой папке или подпапке:
Dir["/path/to/search/**/*.rb"]
Ответ 2
Dir.entries(folder)
Пример:
Dir.entries(".")
Источник: http://ruby-doc.org/core/classes/Dir.html#method-c-entries
Ответ 3
Следующие фрагменты точно показывают имя файлов внутри каталога, пропуская подкаталоги и ".", ".." пунктирные папки:
Dir.entries("your/folder").select {|f| !File.directory? f}
Ответ 4
Чтобы получить все файлы (только файлы) рекурсивно:
Dir.glob('path/**/*').select{ |e| File.file? e }
 Или что-нибудь, что не является каталогом (File.file? Будет отклонять нестандартные файлы):
Dir.glob('path/**/*').reject{ |e| File.directory? e }
Альтернативное решение
 Использование  Find#find над методом поиска на основе Dir.glob как Dir.glob на самом деле лучше. Посмотрите этот ответ на вопрос: "Однострочная запись в каталоги рекурсивного списка в Ruby?" ,
Ответ 5
Это работает для меня:
Если вы не хотите скрытых файлов [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 вернет скрытые файлы, и вам не понадобится подстановочный знак asterix (вы можете просто передать переменную с именем каталога), но она вернет базовое имя напрямую, поэтому функции 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
Ответ 6
Лично я нашел, что это наиболее полезно для циклизации файлов в папке, с перспективой безопасности:
Dir['/etc/path/*'].each do |file_name|
  next if File.directory? file_name 
end
Ответ 7
Это решение для поиска файлов в каталоге:
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
 В Ruby 2.5 теперь вы можете использовать Dir.children. Он получает имена файлов в виде массива, кроме "." а также ".."
Пример:
Dir.children("testdir")   #=> ["config.h", "main.rb"]
Ответ 9
При получении всех имен файлов в каталоге этот фрагмент может использоваться для отклонения обоих каталогов [ ., ..] и скрытых файлов, начинающихся с .
files = Dir.entries("your/folder").reject {|f| File.directory?(f) || f[0].include?('.')}
Ответ 10
Это то, что работает для меня:
Dir.entries(dir).select { |f| File.file?(File.join(dir, f)) }
 Dir.entries возвращает массив строк. Затем мы должны предоставить полный путь файла к File.file?, если dir не соответствует нашей текущей рабочей директории. Вот почему это File.join().
Ответ 11
Вы также можете использовать Rake::FileList (при условии, что у вас есть зависимость rake):
FileList.new('lib/*') do |file|
  p file
end
В соответствии с API:
Списки файлов ленивы. При предоставлении списка шаблонов глобуса для возможных файлы, которые должны быть включены в список файлов, вместо поиска файла структуры для поиска файлов, FileList содержит шаблон для последних использовать.
Ответ 12
Если вы хотите получить массив имен файлов , включая символические ссылки, используйте
Dir.new('/path/to/dir').entries.reject { |f| File.directory? f }
или даже
Dir.new('/path/to/dir').reject { |f| File.directory? f }
и если вы хотите перейти без символических ссылок, используйте
Dir.new('/path/to/dir').select { |f| File.file? f }
Как показано в других ответах, используйте Dir.glob('/path/to/dir/**/*') вместо Dir.new('/path/to/dir'), если вы хотите, чтобы все файлы были рекурсивно.
Ответ 13
Dir.new('/home/user/foldername').each { |file| puts file }
Ответ 14
 В дополнение к предложениям в этой теме я хотел бы упомянуть, что если вам нужно также возвращать точечные файлы (.gitignore и т.д.), То в Dir.glob вам нужно будет включить флаг следующим образом: Dir.glob("/path/to/dir/*", File::FNM_DOTMATCH) По умолчанию Dir.entries включает точечные файлы, а также текущие родительские каталоги.
Для всех, кому было интересно, мне было любопытно, как ответы здесь сравниваются друг с другом во время выполнения, вот результаты против глубоко вложенной иерархии. Первые три результата не являются рекурсивными:
       user     system      total        real
Dir[*]: (34900 files stepped over 100 iterations)
  0.110729   0.139060   0.249789 (  0.249961)
Dir.glob(*): (34900 files stepped over 100 iterations)
  0.112104   0.142498   0.254602 (  0.254902)
Dir.entries(): (35600 files stepped over 100 iterations)
  0.142441   0.149306   0.291747 (  0.291998)
Dir[**/*]: (2211600 files stepped over 100 iterations)
  9.399860  15.802976  25.202836 ( 25.250166)
Dir.glob(**/*): (2211600 files stepped over 100 iterations)
  9.335318  15.657782  24.993100 ( 25.006243)
Dir.entries() recursive walk: (2705500 files stepped over 100 iterations)
 14.653018  18.602017  33.255035 ( 33.268056)
Dir.glob(**/*, File::FNM_DOTMATCH): (2705500 files stepped over 100 iterations)
 12.178823  19.577409  31.756232 ( 31.767093)
Они были сгенерированы с помощью следующего сценария бенчмаркинга:
require 'benchmark'
base_dir = "/path/to/dir/"
n = 100
Benchmark.bm do |x|
  x.report("Dir[*]:") do
    i = 0
    n.times do
      i = i + Dir["#{base_dir}*"].select {|f| !File.directory? f}.length
    end
    puts " (#{i} files stepped over #{n} iterations)"
  end
  x.report("Dir.glob(*):") do
    i = 0
    n.times do
      i = i + Dir.glob("#{base_dir}/*").select {|f| !File.directory? f}.length
    end
    puts " (#{i} files stepped over #{n} iterations)"
  end
  x.report("Dir.entries():") do
    i = 0
    n.times do
      i = i + Dir.entries(base_dir).select {|f| !File.directory? File.join(base_dir, f)}.length
    end
    puts " (#{i} files stepped over #{n} iterations)"
  end
  x.report("Dir[**/*]:") do
    i = 0
    n.times do
      i = i + Dir["#{base_dir}**/*"].select {|f| !File.directory? f}.length
    end
    puts " (#{i} files stepped over #{n} iterations)"
  end
  x.report("Dir.glob(**/*):") do
    i = 0
    n.times do
      i = i + Dir.glob("#{base_dir}**/*").select {|f| !File.directory? f}.length
    end
    puts " (#{i} files stepped over #{n} iterations)"
  end
  x.report("Dir.entries() recursive walk:") do
    i = 0
    n.times do
      def walk_dir(dir, result)
        Dir.entries(dir).each do |file|
          next if file == ".." || file == "."
          path = File.join(dir, file)
          if Dir.exist?(path)
            walk_dir(path, result)
          else
            result << file
          end
        end
      end
      result = Array.new
      walk_dir(base_dir, result)
      i = i + result.length
    end
    puts " (#{i} files stepped over #{n} iterations)"
  end
  x.report("Dir.glob(**/*, File::FNM_DOTMATCH):") do
    i = 0
    n.times do
      i = i + Dir.glob("#{base_dir}**/*", File::FNM_DOTMATCH).select {|f| !File.directory? f}.length
    end
    puts " (#{i} files stepped over #{n} iterations)"
  end
end
 Различия в количестве файлов связаны с тем, что Dir.entries по умолчанию включает скрытые файлы. Dir.entries итоге занял немного больше времени в этом случае из-за необходимости перестроить абсолютный путь к файлу, чтобы определить, был ли файл каталогом, но даже без этого он по-прежнему занимал значительно больше времени, чем другие параметры в рекурсивном случае., Это все с использованием ruby 2.5.1 на OSX.
Ответ 15
 Один простой способ может быть: 
dir = './' # desired directory
files = Dir.glob(File.join(dir, '**', '*')).select{|file| File.file?(file)}
files.each do |f|
    puts f
end
Ответ 16
def get_path_content(dir)
  queue = Queue.new
  result = []
  queue << dir
  until queue.empty?
    current = queue.pop
    Dir.entries(current).each { |file|
      full_name = File.join(current, file)
      if not (File.directory? full_name)
        result << full_name
      elsif file != '.' and file != '..'
          queue << full_name
      end
    }
  end
  result
end
возвращает относительные пути файлов из каталога и всех подкаталогов
Ответ 17
В контексте IRB вы можете использовать следующее для получения файлов в текущем каталоге:
file_names = 'ls'.split("\n")
Вы можете сделать эту работу и в других каталогах:
file_names = 'ls ~/Documents'.split("\n")
Ответ 18
этот код возвращает только имена файлов с их расширением (без глобального пути)
Dir.children("/path/to/search/")
