Parcourez chaque fichier d’un répertoire

Comment puis-je é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 façon de faire est de faire chaque boucle.
Le fichier ruby ​​sera exécuté à partir d’un répertoire différent de celui que je souhaite parcourir.

J’ai essayé le Dir.foreach et je ne pouvais pas le faire fonctionner.

Comme d’autres l’ont dit, Dir.foreach est une bonne option. Cependant, notez que Dir.ensortinges et Dir.foreach seront toujours affichés . 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.ensortinges affichent également tous les éléments du répertoire, Dir.foreach Dir.ensortinges cachés ou non. 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 répertoires cachés.

Alternativement, vous voudrez peut-être regarder dans Dir.glob qui fournit une correspondance simple avec des caractères génériques:

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

C’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 travailler sur tous les fichiers dans les sous-répertoires:

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

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 
 Dir.foreach("/home/mydir") do |fname| puts fname end 

La bibliothèque find est spécifiquement conçue pour cette tâche: http://stdlib.rubyonrails.org/libdoc/find/rdoc/index.html

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

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

J’aime celui-ci, qui 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 object Pathname au lieu d’une chaîne, que vous pouvez faire des choses utiles avec et parcourir plus loin.

 Dir.new('/my/dir').each do |name| ... end