web-dev-qa-db-fra.com

Itérer dans tous les fichiers d'un répertoire

Comment écrire une boucle dans Ruby pour pouvoir exécuter un bloc de code sur chaque fichier?

Je suis nouveau sur Ruby et j’ai conclu que la meilleure façon de le faire est de faire chaque boucle.
Le fichier Ruby sera exécuté à partir d'un répertoire différent du répertoire que je souhaite parcourir.

J'ai essayé le Dir.foreach et je n'ai pas réussi à le faire fonctionner.

265
Andrew

Comme d'autres l'ont dit, Dir.foreach est une bonne option ici. Notez cependant que Dir.entries et _Dir.foreach_ affichera toujours _._ et _.._ (les répertoires actuel et parent). Vous ne voudrez généralement pas travailler dessus, vous pouvez donc faire quelque chose comme ceci:

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

_Dir.foreach_ et _Dir.entries_ affichent également tous les éléments du répertoire - masqués et non masqués. C’est souvent ce que vous voulez, mais si ce n’est pas le cas, vous devez faire quelque chose pour ignorer les fichiers et les répertoires cachés.

Alternativement, vous voudrez peut-être examiner Dir.glob qui fournit une correspondance générique simple:

_Dir.glob('/path/to/dir/*.rb') do |rb_file|
  # do work on files ending in .rb in the desired directory
end
_
419
Telemachus

Ceci est ma méthode préférée pour être facile à lire:

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

Et vous pouvez même étendre cela pour qu'il fonctionne sur tous les fichiers de subdirs:

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

Dir a également une syntaxe plus courte pour obtenir un tableau de tous les fichiers du répertoire:

Dir['dir/to/files/*'].each do |fname|
    # do something with fname
end
28
wawka
Dir.foreach("/home/mydir") do |fname|
  puts fname
end
25
Fred

La bibliothèque de recherche est spécialement conçue pour cette tâche: https://Ruby-doc.org/stdlib-2.5.1/libdoc/find/rdoc/Find.html

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

Ceci est une bibliothèque standard Ruby, elle devrait donc être disponible

13
Faisal

J'aime celui-ci, cela n'a pas été mentionné ci-dessus.

require 'pathname'

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

L'avantage est que vous obtenez un objet Pathname au lieu d'une chaîne, que vous pouvez faire avec des choses utiles et parcourir plus loin.

6
skagedal
Dir.new('/my/dir').each do |name|
  ...
end
3
Nick Moore