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?

90
demandé sur the Tin Man 2010-03-03 14:22:09

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).

Ruby Glob Docs

155
répondu sepp2k 2017-12-06 20:47:04

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) }
52
répondu FelipeC 2012-11-26 16:34:52

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['**/*']
26
répondu MBO 2010-03-03 11:41:58

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)
5
répondu johannes 2010-03-03 11:40:08

, 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) } }
5
répondu troelskn 2013-03-12 20:29:01

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?

2
répondu Ramesh 2012-03-24 14:55:19

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) }
1
répondu HomeTurf 2012-03-23 17:20:50

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', '*'))
0
répondu shacker 2013-05-07 22:28:11
Dir.open(Dir.pwd).map { |h| (File.file?(h) ? "#{h} - file" : "#{h} - folder") if h[0] != '.' }

points de retour néant, à l'utilisation compact

-1
répondu ruvan 2012-06-12 00:22:03