2016-10-19 14 views
2

Ich versuche, mehr als 50.000 Bilder in mehreren Ordnern in einem einzigen Ordner mit Terminal (Mac OS X El Capitan) zu kopieren. Ich habe es geschafft, dies mit ein paar Bilder zu erreichen mit:Kopieren Sie viele Bilder in einen neuen Ordner mit Rekursion

cp `find . -name "*.jpg"` resultsFolder 

aber ich erhalte eine Fehlermeldung (Argumentliste zu lang), wenn sie auf 50.000 Bilder mit diesen Code auszuführen versuchen. Wie überwinde ich diesen Fehler und beschleunige diesen Prozess vielleicht (vielleicht mit GNU parallel?).

Ich hoffe auch, dies von innerhalb R unter Verwendung system() ausführen.

Vielen Dank im Voraus!

+0

Für Speedup kopiert werden konnten: http://unix.stackexchange.com/questions/124527/speed-up-copying-1000000-small-files –

Antwort

3

Dies geschieht, weil die ARG_MAX (oder analog in anderen Bibliotheken als glibc) ausgelöst wird.

Ineffiziente, das Kopieren von Dateien einen nach dem anderen:

find . -type f -iname '*.jpg' -exec cp -t /foo/bar {} + 
+0

Doppel -Quoten die Dateien als, '" {} "' würde Leerzeichen in Dateinamen beibehalten, und auch ein '-v' Flag für ausführliche wäre besser für die Lesbarkeit. +1 – Inian

+0

OK ich folge nicht ganz. Ich bekomme immer einen Fehler (cp: illegale Option - t). Nur zur Bestätigung, ich cd in den übergeordneten Ordner mit den mehreren Ordnern mit Bildern. Dann benutze ich finden. -type f -iname '*.jpg '-exec cp -t/foo/bar {} + Obwohl ich dem Abschnitt/foo/bar nicht ganz folge? Brauche ich einen Ordner namens foo im übergeordneten Ordner und darin einen Ordner namens bar. Sorry, vielleicht bin ich ein bisschen dicht? Vielen Dank für die Hilfe von allen! Schätze es wirklich. – Ross

+0

@Inian Anscheinend funktioniert '+' nicht mit 'cp {}', da die Befehlszeile durch Anhängen erstellt wird. Außerdem behandelt '{}' Dateinamen mit Leerzeichen. – heemayl

0

Try

find . -name "*.jpg" | xargs -i cp {} resultsFolder 
:

find . -type f -iname '*.jpg' -exec cp {} /foo/bar \; 

Wenn Sie GNU haben cp, Sie + mit der -exec Wirkung von find nutzen können

+0

'xargs' mit cp' wird nicht benötigt, da' find' selbst die copy/move-Aktion mit der '-exec'-Option ausführen kann. – Inian

0

gibt es Exac tly ein fantastischer Weg, dies zu tun:

find . -name "*.jpg" -print0 | xargs -0 cp -t resultsFolder 

ist dies immer schneller für> 1 Datei als find -exec cp {} oder find | xargs -i cp {} und behandelt jede Art von Zeichen in Dateinamen. für große Dateien ist es nur geringfügig schneller als die Alternativen, da die meiste Zeit tatsächlich kopiert wird. für viele kleine Dateien kann es eine Größenordnung schneller sein.

Test: copy 3422 ~ 20k-Dateien (OSX Yosemite, Ende 2013 MacBook Pro 2,6 GHz i7, 16 GB RAM, 500 GB SSD):

find -exec cp {}   29.445s 
find | xargs -i cp {} 22.800s 
find | xargs cp -t  0.599s 
1

Eine Implementierung R basiert auf this answer (Sie können "/tmp" ersetzen mit einem Ergebnisordner Ihrer Wahl).

flist <- list.files(".", "*.jpg", full.names = TRUE, recursive = TRUE) 
file.copy(flist, "/tmp") 

Wenn doppelte Dateinamen vorhanden sind, werden sie nicht kopiert. R kann Ihnen sagen, welche Dateien nicht kopiert wurden, wenn Sie das Ergebnis des Kopiervorgangs speichern (ähnlich können Sie tempdir() durch das Verzeichnis Ihrer Wahl ersetzen).

copysucceeded <- file.copy(flist, tempdir()) 

Dateien anzeigen, die nicht

flist[!copysucceeded] 
Verwandte Themen