One-liner récursive de la liste des répertoires en Ruby?
Quel est le moyen le plus rapide, le plus optimisé, d'obtenir un tableau des répertoires (à l'exclusion des fichiers) dans Ruby?
et si on incluait des fichiers?
9 réponses
Dir.glob("**/*/") # for directories
Dir.glob("**/*") # for all files
au lieu de Dir.glob(foo)
, vous pouvez aussi écrire Dir[foo]
(cependant Dir.glob
peut aussi prendre un bloc, auquel cas il donnera chaque chemin au lieu de créer un tableau).
je pense qu'aucune des solutions ici ne concerne les répertoires cachés (par exemple '.test"):
require 'find'
Find.find('.') { |e| puts e if File.directory?(e) }
Pour la liste des répertoires, essayez
Dir['**/']
liste des fichiers est plus difficile, parce que dans le répertoire Unix est aussi un fichier, donc vous devez tester pour le type ou supprimer des entrées de la liste retournée qui est parent d'autres entrées.
Dir['**/*'].reject {|fn| File.directory?(fn) }
Et pour la liste de tous les fichiers et répertoires simplement
Dir['**/*']
Vite, une doublure
répertoires seulement
`find -type d`.split("\n")
répertoires et fichiers normaux
`find -type d -or -type f`.split("\n")`
pur beau rubis
require "pathname"
def rec_path(path, file= false)
puts path
path.children.collect do |child|
if file and child.file?
child
elsif child.directory?
rec_path(child, file) + [child]
end
end.select { |x| x }.flatten(1)
end
# only directories
rec_path(Pathname.new(dir), false)
# directories and normal files
rec_path(Pathname.new(dir), true)
, Comme indiqué dans d'autres réponses ici, vous pouvez utiliser Dir.glob
. Gardez à l'esprit que les dossiers peuvent avoir beaucoup de caractères étranges en eux, et les arguments glob sont des modèles, de sorte que certains caractères ont des significations spéciales. Par conséquent, il est dangereux de faire quelque chose comme ce qui suit:
Dir.glob("#{folder}/**/*")
au lieu de:
Dir.chdir(folder) { Dir.glob("**/*").map {|path| File.expand_path(path) } }
en PHP ou dans d'autres langues pour obtenir le contenu d'un répertoire et tous ses sous-répertoires, vous devez écrire quelques lignes de code, mais en Ruby il prend 2 lignes:
require 'find'
Find.find('./') do |f| p f end
cela permettra d'imprimer le contenu du répertoire courant et de ses sous-répertoires.
ou plus court, vous pouvez utiliser la ’**’
notation:
p Dir['**/*.*']
combien de lignes écrirez-vous en PHP ou en Java pour obtenir le même résultat?
bien que ce ne soit pas une solution en une seule ligne, je pense que c'est la meilleure façon de le faire en utilisant ruby calls.
supprimer D'abord tous les fichiers de façon récursive
Deuxième supprimer tous les répertoires vides
Dir.glob("./logs/**/*").each { |file| File.delete(file) if File.file? file }
Dir.glob("./logs/**/*/").each { |directory| Dir.delete(directory) }
voici un exemple qui combine la découverte dynamique d'un répertoire de projet Rails avec Dir.glob:
dir = Dir.glob(Rails.root.join('app', 'assets', 'stylesheets', '*'))
Dir.open(Dir.pwd).map { |h| (File.file?(h) ? "#{h} - file" : "#{h} - folder") if h[0] != '.' }
points de retour néant, à l'utilisation compact