Obtenez les noms de tous les fichiers à partir D'un dossier avec Ruby
je veux obtenir tous les noms de fichiers d'un dossier en utilisant Ruby.
14 réponses
vous avez aussi l'option de raccourci de
Dir["/path/to/search/*"]
et si vous voulez trouver tous les fichiers Ruby dans n'importe quel dossier ou sous-dossier:
Dir["/path/to/search/**/*.rb"]
Dir.entries(folder)
exemple:
Dir.entries(".")
Source: http://ruby-doc.org/core/classes/Dir.html#method-c-entries
les extraits suivants montrent exactement le nom des fichiers à l'intérieur d'un répertoire, sautant les sous-répertoires et "."
, ".."
dossiers en pointillés:
Dir.entries("your/folder").select {|f| !File.directory? f}
pour obtenir tous les fichiers (strictement fichiers seulement) récursivement:
Dir.glob('path/**/*').select{ |e| File.file? e }
ou tout ce qui n'est pas un répertoire ( File.file?
rejetterait les fichiers non-réguliers):
Dir.glob('path/**/*').reject{ |e| File.directory? e }
Alternative Solution
utilisant Find#find
sur une méthode de recherche basée sur un modèle comme Dir.glob
est en fait mieux. Voir cette réponse à "One-liner Récursive de la Liste des Répertoires en Ruby?" .
personnellement, J'ai trouvé cela le plus utile pour boucler des fichiers dans un dossier, la sécurité prospective:
Dir['/etc/path/*'].each do |file_name|
next if File.directory? file_name
end
ça marche pour moi:
si vous ne voulez pas de fichiers cachés[1], utilisez Dir [] :
# With a relative path, Dir[] will return relative paths
# as `[ './myfile', ... ]`
#
Dir[ './*' ].select{ |f| File.file? f }
# Want just the filename?
# as: [ 'myfile', ... ]
#
Dir[ '../*' ].select{ |f| File.file? f }.map{ |f| File.basename f }
# Turn them into absolute paths?
# [ '/path/to/myfile', ... ]
#
Dir[ '../*' ].select{ |f| File.file? f }.map{ |f| File.absolute_path f }
# With an absolute path, Dir[] will return absolute paths:
# as: [ '/home/../home/test/myfile', ... ]
#
Dir[ '/home/../home/test/*' ].select{ |f| File.file? f }
# Need the paths to be canonical?
# as: [ '/home/test/myfile', ... ]
#
Dir[ '/home/../home/test/*' ].select{ |f| File.file? f }.map{ |f| File.expand_path f }
Maintenant, Dir.les entrées retourneront les fichiers cachés, et vous n'avez pas besoin du Joker Astérix (vous pouvez simplement passer la variable avec le nom du répertoire), mais il retournera le nom de base directement, donc le fichier.les fonctions xxx ne fonctionneront pas.
# In the current working dir:
#
Dir.entries( '.' ).select{ |f| File.file? f }
# In another directory, relative or otherwise, you need to transform the path
# so it is either absolute, or relative to the current working dir to call File.xxx functions:
#
home = "/home/test"
Dir.entries( home ).select{ |f| File.file? File.join( home, f ) }
[1] .dotfile
sur unix, je n'ai pas savoir sur Windows
C'est une solution pour trouver des fichiers dans un répertoire:
files = Dir["/work/myfolder/**/*.txt"]
files.each do |file_name|
if !File.directory? file_name
puts file_name
File.open(file_name) do |file|
file.each_line do |line|
if line =~ /banco1/
puts "Found: #{line}"
end
end
end
end
end
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 .
files = Dir.entries("your/folder").reject {|f| File.directory?(f) || f[0].include?('.')}
dans Ruby 2.5, vous pouvez maintenant utiliser Dir.children
. Il obtient des noms de fichiers comme tableau sauf pour "." et." ."
exemple:
Dir.children("testdir") #=> ["config.h", "main.rb"]
C'est ce qui fonctionne pour moi:
Dir.entries(dir).select { |f| File.file?(File.join(dir, f)) }
Dir.entries
renvoie un tableau de chaînes. Ensuite , nous devons fournir un chemin complet du fichier vers File.file?
, à moins que dir
ne soit égal à notre répertoire courant. C'est pourquoi ce File.join()
.
si vous voulez obtenir un tableau de noms de fichiers incluant les liens symboliques , utilisez
Dir.new('/path/to/dir').entries.reject { |f| File.directory? f }
ou même
Dir.new('/path/to/dir').reject { |f| File.directory? f }
et si vous voulez aller sans liens symboliques , utilisez
Dir.new('/path/to/dir').select { |f| File.file? f }
comme indiqué dans d'autres réponses, utilisez Dir.glob('/path/to/dir/**/*')
au lieu de Dir.new('/path/to/dir')
si vous voulez obtenir tous les fichiers de façon récursive.
def get_path_content(dir)
queue = Queue.new
result = []
queue << dir
until queue.empty?
current = queue.pop
Dir.entries(current).each { |file|
full_name = File.join(current, file)
if not (File.directory? full_name)
result << full_name
elsif file != '.' and file != '..'
queue << full_name
end
}
end
result
end
renvoie les chemins relatifs du fichier à partir du répertoire et de tous les sous-répertoires
vous pouvez également utiliser Rake::FileList
(à condition que vous ayez la" dépendance 151920920"):
FileList.new('lib/*') do |file|
p file
end
selon L'API:
les listes sont paresseuses. Lorsqu'on lui donne une liste des modèles de globes pour possible les fichiers à inclure dans la liste des fichiers, au lieu de chercher le fichier structures pour trouver les fichiers, une liste de fichiers contient le motif pour ces derniers utiliser.