wake-up-neo.com

Durchsuchen eines Ordners und aller seiner Unterordner nach Dateien eines bestimmten Typs

Ich versuche, nach allen Dateien eines bestimmten Typs (z. B. .pdf) in einem bestimmten Ordner zu suchen und sie in einen neuen Ordner zu kopieren. Ich muss lediglich einen Stammordner angeben und diesen Ordner und alle Unterordner nach Dateien durchsuchen, die dem angegebenen Typ (.pdf) entsprechen. Kann mir jemand helfen, wie ich die Unterordner des Stammordners und deren Unterordner durchsuchen soll und so weiter. Es hört sich so an, als würde eine rekursive Methode hier den Trick ausführen, aber ich kann sie nicht korrekt implementieren. (Ich implementiere dieses Programm in Ruby übrigens).

65
agentbanks217

Sie möchten das Find Modul. Find.find nimmt eine Zeichenfolge, die einen Pfad enthält, und übergibt den übergeordneten Pfad zusammen mit dem Pfad jeder Datei und jedes Unterverzeichnisses an einen zugehörigen Block. Einige Beispielcodes:

require 'find'

pdf_file_paths = []
Find.find('path/to/search') do |path|
  pdf_file_paths << path if path =~ /.*\.pdf$/
end

Dadurch wird rekursiv ein Pfad durchsucht und alle mit .pdf endenden Dateinamen in einem Array gespeichert.

60
jergason

Versuche dies:

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

das ist das gleiche wie

Dir["#{folder}/**/*.pdf"]

Wobei die Ordnervariable der Pfad zum Stammordner ist, den Sie durchsuchen möchten.

102
rogerdpack

Wenn Geschwindigkeit wichtig ist, ziehen Sie Dir.globFind.find Vor.

Warming up --------------------------------------
           Find.find   124.000  i/100ms
            Dir.glob   515.000  i/100ms
Calculating -------------------------------------
           Find.find      1.242k (± 4.7%) i/s -      6.200k in   5.001398s
            Dir.glob      5.249k (± 4.5%) i/s -     26.265k in   5.014632s

Comparison:
            Dir.glob:     5248.5 i/s
           Find.find:     1242.4 i/s - 4.22x slower

require 'find'
require 'benchmark/ips'

dir = '.'

Benchmark.ips do |x|
  x.report 'Find.find' do
    Find.find(dir).select { |f| f =~ /\*\.pdf/ }
  end

  x.report 'Dir.glob' do
    Dir.glob("#{dir}/**/*\.pdf")
  end

  x.compare!
end

Ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin15] verwenden

22
Dennis

Als kleine Verbesserung der obigen Antwort von Jergason und Matt können Sie Folgendes zu einer einzigen Zeile zusammenfassen:

pdf_file_paths = Find.find('path/to/search').select { |p| /.*\.pdf$/ =~ p }

Hierbei wird wie oben die Find-Methode verwendet, jedoch die Tatsache genutzt, dass das Ergebnis eine Aufzählung ist (und daher können wir select verwenden), um ein Array mit den Übereinstimmungen zurückzugewinnen

11
chrisdurheim