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.
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
_
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
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 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
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.
Dir.new('/my/dir').each do |name|
...
end