wake-up-neo.com

Einzeilig, um Verzeichnisse in Ruby rekursiv aufzulisten?

Was ist die schnellste, optimierte und einzeilige Methode, um ein Array der Verzeichnisse (ohne Dateien) in Ruby abzurufen?

Wie wäre es mit Dateien?

92
Lance Pollard
Dir.glob("**/*/") # for directories
Dir.glob("**/*") # for all files

Anstelle von Dir.glob(foo) können Sie auch Dir[foo] Schreiben (Dir.glob Kann jedoch auch einen Block enthalten, in diesem Fall wird jeder Pfad ausgegeben, anstatt ein Array zu erstellen).

Ruby Glob Docs

166
sepp2k

Ich glaube, keine der Lösungen hier befasst sich mit versteckten Verzeichnissen (z. B. '.test'):

require 'find'
Find.find('.') { |e| puts e if File.directory?(e) }
53
FelipeC

Für eine Liste der Verzeichnisse versuchen

Dir['**/']

Die Liste der Dateien ist schwieriger, da das Unix-Verzeichnis auch eine Datei ist. Sie müssen daher prüfen, ob Einträge eingegeben oder aus der zurückgegebenen Liste entfernt werden, die übergeordnet zu anderen Einträgen ist.

Dir['**/*'].reject {|fn| File.directory?(fn) }

Und für die Liste aller Dateien und Verzeichnisse einfach

Dir['**/*']
28
MBO

Schneller Einzeiler

Nur Verzeichnisse

`find -type d`.split("\n")

Verzeichnisse und normale Dateien

`find -type d -or -type f`.split("\n")`

Reiner schöner Rubin

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

Wie bereits in anderen Antworten erwähnt, können Sie Dir.glob. Denken Sie daran, dass Ordner viele seltsame Zeichen enthalten können und Glob-Argumente Muster sind, sodass einige Zeichen eine besondere Bedeutung haben. Daher ist es nicht sicher, Folgendes zu tun:

Dir.glob("#{folder}/**/*")

Mach stattdessen:

Dir.chdir(folder) { Dir.glob("**/*").map {|path| File.expand_path(path) } }
6
troelskn

In PHP oder anderen Sprachen, um den Inhalt eines Verzeichnisses und aller seiner Unterverzeichnisse zu erhalten, müssen Sie einige Codezeilen schreiben, aber in Ruby benötigt es 2 Linien:

require 'find'
Find.find('./') do |f| p f end

dadurch wird der Inhalt des aktuellen Verzeichnisses und aller seiner Unterverzeichnisse gedruckt.

Oder kürzer, Sie können die ’**’ Notation:

p Dir['**/*.*']

Wie viele Zeilen werden Sie in PHP oder in Java schreiben, um das gleiche Ergebnis zu erhalten?

2
Ramesh

Hier ist ein Beispiel, das die dynamische Ermittlung eines Rails Projektverzeichnisses mit Dir.glob kombiniert:

dir = Dir.glob(Rails.root.join('app', 'assets', 'stylesheets', '*'))
0
shacker

Obwohl dies keine einzeilige Lösung ist, ist dies meiner Meinung nach der beste Weg, dies mit Ruby - Aufrufen zu tun.

Löschen Sie zunächst alle Dateien rekursiv
Zweitens löschen Sie alle leeren Verzeichnisse

Dir.glob("./logs/**/*").each { |file| File.delete(file) if File.file? file }
Dir.glob("./logs/**/*/").each { |directory| Dir.delete(directory) }
0
HomeTurf