Ich habe eine Million Images, die 30 GB Speicherplatz beanspruchen und von einem lokalen Verzeichnis in ein anderes lokales Verzeichnis verschoben werden müssen.
Was wäre der effizienteste Weg, dies zu tun? Verwenden mv
? Verwenden cp
? Verwenden rsync
? Etwas anderes?
Ich muss diese nehmen:
/path/to/old-img-dir/*
00000000.jpg
--------.jpg ## nearly 1M of them! ##
ZZZZZZZZ.jpg
und bewege sie hierher:
/path/to/new/img/dir/
mv
Leistung übertreffen können , wenn sich sowohl das Quell- als auch das Zielverzeichnis im selben Dateisystem befinden.Antworten:
rsync
Dies wäre eine schlechte Wahl, da viele Client- / Server-Hintergrundarbeiten ausgeführt werden, die sowohl lokale als auch Remote-Systeme berücksichtigen.mv
ist wahrscheinlich die beste Wahl. Wenn möglich, sollten Sie esmv directory_old directory_new
lieber versuchen alsmv directory_old/* directory_new/
. Auf diese Weise bewegen Sie eine Sache anstelle von einer Million Dingen.quelle
mv
von Millionen unterstützt werden.mv
nur die Inode-Informationen aktualisiert, sodass siemv directory_old directory_new
schneller funktionieren alsmv directory_old/* directory_new
find -print0
Mitxargs -0
können Sie Leerzeichen in den Namen verwenden.xargs -r
wird nur ausgeführt,mv
wenn etwas verschoben werden muss. (mv
wird sich beschweren, wenn keine Quelldateien angegeben sind).mv -t
können Sie zuerst das Ziel und dann die Quelldateien angeben, die von benötigt werdenxargs
.Übrigens würde ich mich fragen, ob ich wirklich so viele Dateien gleichzeitig verschieben muss. Die Stapelverarbeitung wird überbewertet. Ich versuche, keine großen Mengen an Arbeit anzusammeln, wenn ich Dinge in dem Moment verarbeiten kann, in dem sie generiert werden.
quelle
Wenn sich die beiden Verzeichnisse im selben Dateisystem befinden, verwenden Sie
mv
das VERZEICHNIS und nicht den Inhalt des Verzeichnisses.Wenn sie sich auf zwei verschiedenen Dateisystemen befinden, verwenden Sie rsync:
rsync -av /source/directory/ /destination
Beachten Sie das Nachlaufen
/
der Quelle. Dies bedeutet, dass der INHALT des Verzeichnisses und nicht das Verzeichnis selbst kopiert wird. Wenn Sie diese Option/
deaktivieren, werden die Dateien weiterhin kopiert, sie befinden sich jedoch in einem Verzeichnis mit dem Namen/destination/directory
. Mit dem / werden die Dateien nur in/destination
rsync
behält den Dateibesitz bei, wenn Sie ihn als root ausführen oder wenn die Dateien Ihnen gehören. Es wird auch diemtime
von jeder einzelnen Datei verwaltet.quelle
rsync
scheinen Kreise herumzulaufenmv
. Danke für den Tipp!Wenn Sie 'cp' verwenden, führt jede Datei ein Öffnen-Lesen-Schließen-Öffnen-Schreiben-Schließen durch. Tar verwendet verschiedene Verfahren zum Lesen und Schreiben sowie mehrere Schritte, um mehrere Dateien gleichzeitig zu bearbeiten. Selbst auf einer einzelnen CPU-Box sind Multithread-Apps schneller.
quelle
tar c | tar x
Sie Kosten von O (total_size) anstelle von O (file_count).Da beide directory_old und directory_new im gleichen Dateisystem ist , könnten Sie verwenden ,
cp -l
anstattmv
als eine Option.cp -l
erstellt einen festen Link zu den Originaldateien. Wenn Sie mit 'Verschieben' fertig sind und mit dem Ergebnis zufrieden sind, können Sie diese Dateien aus directory_old entfernen. In Bezug auf die Geschwindigkeit ist es dasselbe wie 'mv', wenn Sie zuerst die Links erstellen und dann die ursprünglichen entfernen. Mit diesem Ansatz können Sie jedoch von vorne beginnen, wenn dies sinnvoll istquelle
Es kommt darauf an (tm). Wenn Ihr Dateisystem Copy-on-Write ist, sollte Copy (
cp
oderrsync
zum Beispiel) mit einem Umzug vergleichbar sein. In den meisten Fällen ist move (mv
) jedoch am schnellsten, da einfach die Daten umgeschaltet werden können, die beschreiben, wo eine Datei abgelegt wird (Hinweis: Dies ist zu stark vereinfacht).Bei einer durchschnittlichen Linux-Installation würde ich mich also entscheiden
mv
.EDIT: @ Frédéric Hamidi hat einen guten Punkt in den Kommentaren: Dies ist nur gültig, wenn beide auf dem gleichen Dateisystem und der gleichen Festplatte sind. Andernfalls werden die Daten trotzdem kopiert.
quelle
Um mindestens ~ 10k Dateien (keine Verzeichnisse) zu kopieren, beschwerte sich cp mit:
Die beste Option ist Rsync:
Und es war sehr schnell erledigt!
quelle
Wenn Sie über freien Speicherplatz verfügen, archivieren Sie diese in einer einzelnen .tar-Datei (ohne schnellere Komprimierung), verschieben Sie diese Datei und entfernen Sie die Archivierung.
quelle
Die Art des Ziels würde den effizientesten Weg für diese Aufgabe bestimmen. Nehmen wir an , Sie auf einem lokalen System sind, Ihr
PWD
ist/
gerade jetzt. und/a
enthält die Millionen von Bildern. Unsere Aufgabe ist es, alle Bilder zu verschieben/b
und dabei die gesamte Unterverzeichnisstruktur beizubehalten. Nehmen wir an , auch/a
und/b
Punkte sind Halterung für zwei verschiedene Partitionen, die jeweils auf einem lokal angeschlossenen Festplatte. Wir möchten diese Aufgabe mit einer Plane erledigen. Dies könnte einige Zeit dauern, so stellen Sie sicher , dass Sie verwendenscreen
,tmux
oder Sie ausführen dieses als Hintergrundprozess.Das würde kopieren Sie alle Dateien und Verzeichnisse in
/a
zu/b
, so jetzt müssen Sie bis reinigen ,/a
sobald Sie bestätigen es ohne Fehler beendet.quelle