298 votes

Itérer à travers chaque fichier dans un répertoire

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

Je suis nouveau à 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 du répertoire dans lequel je veux passer.

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

463voto

Telemachus Points 12013

Comme d'autres l'ont dit, Dir.foreach est une bonne option ici. Notez, cependant, que Dir.entries et Dir.foreach montrera toujours . et .. (l'actuel et le répertoire parent). En général, vous voulez pas travailler sur eux, de sorte que vous pouvez 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 également afficher tous les éléments dans le répertoire caché et non caché de même. Souvent c'est ce que vous voulez, mais si ce n'est pas le cas, vous avez besoin de faire quelque chose pour sauter par-dessus les fichiers et répertoires cachés.

Sinon, vous voudrez peut-être regarder en Dir.glob qui fournit une simple jokers:

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

102voto

Simple As Could Be Points 3906

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 ceci pour travailler sur tous les fichiers des sous-répertoires:

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

33voto

wawka Points 237

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
 

26voto

Fred Points 4213
Dir.foreach("/home/mydir") do |fname|
  puts fname
end

14voto

Faisal Points 10585

La bibliothèque de recherche est spécialement 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 il devrait être disponible

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X