Je veux obtenir tous les noms de fichiers d'un dossier à l'aide de Ruby.
358
Vous avez également l'option de raccourci
Dir["/path/to/search/*"]
et si vous souhaitez trouver tous les fichiers Ruby dans n'importe quel dossier ou sous-dossier:
Dir["/path/to/search/**/*.rb"]
./...
plutôt que~/
./
signifie le répertoire courant, alors que/
c'est le point de montage racine, et~/
est le répertoire personnel de l'utilisateur. Si vous déplacez l'ensemble du projet ailleurs, le premier fonctionnera, mais les deux autres ne le seront probablement pas.exemple:
Source: http://ruby-doc.org/core/classes/Dir.html#method-c-entries
la source
Dir#glob
aurait peut-être pu être mentionné, par exemple), rien n'empêche quelqu'un d'autre de poster une très bonne réponse. Bien sûr, je suis surtout une sorte de "verre à moitié plein" ...Dir
rarement, et chaque fois que j'en ai besoin, je dois lire la documentation. J'ai posté ma question et ma réponse ici pour que je puisse la retrouver plus tard, et peut-être même aider quelqu'un avec la même question. Je pense avoir entendu au podcast SO qu'il n'y a rien de mal à un tel comportement. Si vous avez une meilleure réponse, veuillez la poster. J'ai posté ce que je sais, je ne suis pas un ninja Ruby. J'accepte régulièrement les réponses avec le plus de votes.Dir[]
ouDir.glob
lorsque l'argument est une variable. Lorsquepath = '/tmp'
, comparez:Dir.glob("#{path}/*")
vsDir.entries(path)
. Les valeurs de retour sont légèrement différentes (".", ".."), mais ce dernier est plus facile à cerner d'un coup d'œil.Les extraits suivants montrent exactement le nom des fichiers dans un répertoire, et sauter les sous - répertoires
"."
,".."
dossiers en pointillés:la source
...select {|f| File.file? f}
pour une signification plus claire et une syntaxe plus courte.Dir.entries("your/folder").select {|f| File.file? f}
!File.directory?
fonctionne maisFile.file?
pas..reject {|f| File.directory? f}
semble plus propre que.select{|f| !File.directory? f}
. Oh, et maintenant je vois le premier commentaire ... aussi bien.Pour obtenir tous les fichiers (strictement les fichiers uniquement) de manière récursive:
Ou tout ce qui n'est pas un répertoire (
File.file?
rejetterait les fichiers non réguliers):Solution alternative
Il est préférable d' utiliser
Find#find
une méthode de recherche basée sur un modèle commeDir.glob
. Voir cette réponse à "One-liner pour répertorier récursivement les répertoires dans Ruby?" .la source
Cela fonctionne pour moi:
Si vous ne voulez pas de fichiers cachés [1], utilisez Dir [] :
Maintenant, Dir.entries renverra des fichiers cachés, et vous n'avez pas besoin de l'astérisme générique (vous pouvez simplement passer la variable avec le nom du répertoire), mais il renverra directement le nom de base, donc les fonctions File.xxx ne fonctionneront pas .
[1]
.dotfile
sous unix, je ne connais pas Windowsla source
Dans Ruby 2.5, vous pouvez maintenant utiliser
Dir.children
. Il obtient les noms de fichiers sous forme de tableau à l'exception de "." et ".."Exemple:
http://ruby-doc.org/core-2.5.0/Dir.html#method-c-children
la source
Personnellement, j'ai trouvé cela le plus utile pour boucler sur des fichiers dans un dossier, pour une sécurité prospective:
la source
Ceci est une solution pour rechercher des fichiers dans un répertoire:
la source
Tout en obtenant tous les noms de fichiers dans un répertoire, cet extrait peut être utilisé pour rejeter à la fois les répertoires [
.
,..
] et les fichiers cachés qui commencent par un.
la source
Dir.entries
renvoie des noms de fichiers locaux, pas des chemins de fichiers absolus. D'un autre côté,File.directory?
attend un chemin de fichier absolu. Ce code ne fonctionne pas comme prévu.ce code renvoie uniquement les noms de fichiers avec leur extension (sans chemin global)
la source
C'est ce qui fonctionne pour moi:
Dir.entries
renvoie un tableau de chaînes. Ensuite, nous devons fournir un chemin complet du fichier versFile.file?
, à moins qu'il nedir
soit égal à notre répertoire de travail actuel. Voilà pourquoi çaFile.join()
.la source
Vous pouvez également utiliser
Rake::FileList
(à condition que vous ayez unerake
dépendance):Selon l'API:
https://docs.ruby-lang.org/en/2.1.0/Rake/FileList.html
la source
Si vous souhaitez obtenir un tableau de noms de fichiers, y compris des liens symboliques , utilisez
ou même
et si vous voulez vous passer de liens symboliques , utilisez
Comme indiqué dans d'autres réponses, utilisez
Dir.glob('/path/to/dir/**/*')
plutôt queDir.new('/path/to/dir')
si vous souhaitez obtenir tous les fichiers de manière récursive.la source
*.*
la source
En plus des suggestions de ce fil, je voulais mentionner que si vous devez également renvoyer des fichiers dot (.gitignore, etc.), avec Dir.glob, vous devrez inclure un indicateur comme
Dir.glob("/path/to/dir/*", File::FNM_DOTMATCH)
suit : Par défaut, Dir.entries inclut des fichiers de points, ainsi que les répertoires parents actuels.Pour toute personne intéressée, j'étais curieux de voir comment les réponses ici se comparaient les unes aux autres en temps d'exécution, voici les résultats contre une hiérarchie profondément imbriquée. Les trois premiers résultats sont non récursifs:
Ceux-ci ont été générés avec le script d'analyse comparative suivant:
Les différences dans le nombre de fichiers sont dues à l'
Dir.entries
inclusion de fichiers cachés par défaut.Dir.entries
a fini par prendre un peu plus de temps dans ce cas en raison de la nécessité de reconstruire le chemin absolu du fichier pour déterminer si un fichier était un répertoire, mais même sans cela, cela prenait toujours plus de temps que les autres options du cas récursif. Tout cela utilisait ruby 2.5.1 sur OSX.la source
Une façon simple pourrait être:
la source
renvoie les chemins relatifs du fichier depuis le répertoire et tous les sous-répertoires
la source
Dans un contexte IRB, vous pouvez utiliser ce qui suit pour obtenir les fichiers dans le répertoire actuel:
Vous pouvez également faire fonctionner cela sur d'autres répertoires:
la source