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).
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.
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.
Wenn Geschwindigkeit wichtig ist, ziehen Sie Dir.glob
Find.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
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