Comment écrire une boucle en 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 le 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 n'ai pas réussi à le faire fonctionner.
ruby
directory
filesystems
Andrew
la source
la source
Dir.foreach
fonctionne pour itérer sur le contenu d'un répertoire, donc quelque chose d'autre se passe.do_something_with(entry) if File.file?(entry)
'img/*.{jpg,png,gif,jpeg}'
pour saisir plusieurs extensions.Réponses:
Comme d'autres l'ont dit,
Dir::foreach
c'est une bonne option ici. Cependant, notez queDir::foreach
etDir::entries
inclura toujours.
et..
(les répertoires courant et parent). Vous ne voudrez généralement pas travailler dessus, vous pouvez donc utiliserDir::each_child
ouDir::children
(comme suggéré par ma11hew28 ) ou faire quelque chose comme ceci:Dir::foreach
etDir::entries
(ainsi queDir::each_child
etDir::children
) incluent également des fichiers et répertoires cachés. C'est souvent ce que vous voulez, mais si ce n'est pas le cas, vous devez faire quelque chose pour les ignorer.Alternativement, vous voudrez peut-être examiner
Dir::glob
ce qui fournit une correspondance simple avec des caractères génériques:la source
Dir.foreach
si le répertoire contient un grand nombre de fichiers!next if File.directory? item
.
ou..
parce que les gens veulent presque toujours ignorer ces deux-là.Dir.foreach
itère plutôt que de créer un tableau (potentiellement énorme) à l'avant (ce qui est leDir.glob
cas). Donc, si le répertoire est vraiment énorme, il peut faire une différence de performance. Dans des circonstances normales, vous ne le remarqueriez pas, mais dans des conditions de stress, cela peut absolument avoir de l'importance.C'est ma méthode préférée pour être facile à lire:
Et vous pouvez même l'étendre pour qu'il fonctionne sur tous les fichiers des sous-répertoires:
la source
Dir a également une syntaxe plus courte pour obtenir un tableau de tous les fichiers du répertoire:
la source
fname
les itérations de?la source
La bibliothèque de recherche est conçue spécifiquement pour cette tâche: https://ruby-doc.org/stdlib-2.5.1/libdoc/find/rdoc/Find.html
Ceci est une bibliothèque rubis standard, elle devrait donc être disponible
la source
File.find
descend récursivement aussi loin que possible, en commençant par le chemin que vous lui donnez. Je ne suis pas sûr que ce soit ce que souhaite le PO.*.rb
àfind()
J'aime celui-ci, qui n'a pas été mentionné ci-dessus.
L'avantage est que vous obtenez un objet Pathname au lieu d'une chaîne, que vous pouvez faire des choses utiles avec et parcourir plus loin.
la source
la source
Dir.foreach
tout enDir.entries
construisant le tableau entier à la fois. Donc, si le répertoire est immense, c'est moins un coup de mémoire. (Ce n'est généralement pas un gros problème, probablement, mais quand même ...)Pour ignorer
.
&..
, vous pouvez utiliserDir::each_child
.Dir::children
renvoie un tableau des noms de fichiers.la source