Перебирать каждый файл в одном каталоге - PullRequest
261 голосов
/ 25 марта 2010

Как мне написать цикл в ruby, чтобы я мог выполнить блок кода для каждого файла?

Я новичок в ruby, и я пришел к выводу, что способ сделать это - цикл каждый раз.
Файл ruby ​​будет выполняться из каталога, отличного от каталога, через который я хочу перейти.

Я попробовал Dir.foreach и не смог заставить его работать.

Ответы [ 7 ]

415 голосов
/ 25 марта 2010

Как уже говорили другие, Dir.foreach - хороший вариант здесь. Однако обратите внимание, что Dir.entries и Dir.foreach всегда будут отображать . и .. (текущий и родительский каталоги). Как правило, вы не хотите работать над ними, поэтому вы можете сделать что-то вроде этого:

Dir.foreach('/path/to/dir') do |item|
  next if item == '.' or item == '..'
  # do work on real items
end

Dir.foreach и Dir.entries также показывают все элементы в каталоге - как скрытые, так и не скрытые. Часто это то, что вы хотите, но если это не так, вам нужно что-то сделать, чтобы пропустить скрытые файлы и каталоги.

В качестве альтернативы вы можете посмотреть Dir.glob, который обеспечивает простое сопоставление с подстановочными знаками:

Dir.glob('/path/to/dir/*.rb') do |rb_file|
  # do work on files ending in .rb in the desired directory
end
95 голосов
/ 12 апреля 2011

Это мой любимый метод для легкого чтения:

Dir.glob("*/*.txt") do |my_text_file|
  puts "working on: #{my_text_file}..."
end

И вы даже можете расширить это для работы со всеми файлами в подкаталогах:

Dir.glob("**/*.txt") do |my_text_file| # note one extra "*"
  puts "working on: #{my_text_file}..."
end
28 голосов
/ 11 декабря 2013

Dir также имеет более короткий синтаксис для получения массива всех файлов из каталога:

Dir['dir/to/files/*'].each do |fname|
    # do something with fname
end
25 голосов
/ 25 марта 2010
Dir.foreach("/home/mydir") do |fname|
  puts fname
end
12 голосов
/ 25 марта 2010

Библиотека поиска разработана специально для этой задачи: https://ruby -doc.org / stdlib-2.5.1 / libdoc / find / rdoc / Find.html

require 'find'
Find.find(path) do |file|
  # process
end

Это стандартная библиотека ruby, поэтому она должна быть доступна

6 голосов
/ 16 ноября 2017

Мне нравится этот, который не был упомянут выше.

require 'pathname'

Pathname.new('/my/dir').children.each do |path|
    puts path
end

Преимущество заключается в том, что вместо строки вы получаете объект Pathname, с которым вы можете делать полезные вещи и проходить дальше.

3 голосов
/ 25 марта 2010
Dir.new('/my/dir').each do |name|
  ...
end
...