Quel est le moyen le plus rapide et le plus optimisé d'obtenir un tableau des répertoires (à l'exclusion des fichiers) dans Ruby?
Que diriez-vous d'inclure des fichiers?
Quel est le moyen le plus rapide et le plus optimisé d'obtenir un tableau des répertoires (à l'exclusion des fichiers) dans Ruby?
Que diriez-vous d'inclure des fichiers?
Réponses:
Dir.glob("**/*/") # for directories
Dir.glob("**/*") # for all files
Au lieu de cela, Dir.glob(foo)
vous pouvez également écrire Dir[foo]
(mais Dir.glob
peut également prendre un bloc, auquel cas il donnera chaque chemin au lieu de créer un tableau).
Dir.glob("**/")
sauf si vous voulez également des liens symboliques
File::FNM_DOTMATCH
indicateur.
Dir.glob("**/*", File::FNM_DOTMATCH)
Je pense qu'aucune des solutions ici ne traite des répertoires cachés (par exemple '.test'):
require 'find'
Find.find('.') { |e| puts e if File.directory?(e) }
Find.find('/tmp').collect {|_|_}
Était utile pour moi
Pour la liste des répertoires, essayez
Dir['**/']
La liste des fichiers est plus difficile, car dans le répertoire Unix est également un fichier, vous devez donc tester le type ou supprimer les 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['**/*']
Seuls les répertoires
`find -type d`.split("\n")
Répertoires et fichiers normaux
`find -type d -or -type f`.split("\n")`
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)
end.select {}.flatten()
partie? J'aime la fonction dans son ensemble. Il semble que cela créera un tableau de tableaux? Serait-il possible de faire la elseif
partie avec: rec_path(child, file) << child.to_s
pour pouvoir l'assigner à un tableau et obtenir un tableau de chaînes? Merci!
Comme indiqué dans d'autres réponses ici, vous pouvez utiliser Dir.glob
. Gardez à l'esprit que les dossiers peuvent contenir beaucoup de caractères étranges et que les arguments glob sont des modèles, donc certains caractères ont des significations spéciales. En tant que tel, il est dangereux de faire quelque chose comme ce qui suit:
Dir.glob("#{folder}/**/*")
Faites plutôt:
Dir.chdir(folder) { Dir.glob("**/*").map {|path| File.expand_path(path) } }
En PHP ou dans d'autres langages pour obtenir le contenu d'un répertoire et de tous ses sous-répertoires, vous devez écrire quelques lignes de code, mais en Ruby cela prend 2 lignes:
require 'find'
Find.find('./') do |f| p f end
cela imprimera le contenu du répertoire courant et tous ses sous-répertoires.
Ou plus court, vous pouvez utiliser la ’**’
notation:
p Dir['**/*.*']
Combien de lignes allez-vous écrire en PHP ou en Java pour obtenir le même résultat?
Bien que ce ne soit pas une solution à une ligne, je pense que c'est la meilleure façon de le faire en utilisant des appels ruby.
Supprimez d'abord tous les fichiers de manière récursive
Deuxième supprimez 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', '*'))
config.assets.paths << Rails.root.join("app", "assets", "*")
, mais je ne pouvais toujours pas voir les sous-dossiers et les fichiers dans le dossier assets parRails.application.config.assets.paths