Итерации через каждый файл в одном каталоге

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

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

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

+246
24 мар. '10 в 23:43
источник поделиться
7 ответов

Как говорили другие, 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
+381
25 мар. '10 в 1:01
источник

Связанные вопросы


Похожие вопросы

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

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
+90
11 апр. '11 в 22:39
источник

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

Dir['dir/to/files/*'].each do |fname|
    # do something with fname
end
+23
11 дек. '13 в 19:09
источник
Dir.foreach("/home/mydir") do |fname|
  puts fname
end
+21
24 мар. '10 в 23:50
источник

Библиотека поиска предназначена специально для этой задачи: http://stdlib.rubyonrails.org/libdoc/find/rdoc/index.html

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

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

+11
25 мар. '10 в 14:03
источник
Dir.new('/my/dir').each do |name|
  ...
end
+3
24 мар. '10 в 23:52
источник

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

require 'pathname'

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

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

0
16 нояб. '17 в 14:40
источник

Посмотрите другие вопросы по меткам или Задайте вопрос