Was ist der schnellste Weg, um eine Million Bilder von einem Verzeichnis in ein anderes zu verschieben?

18469
Ryan

Ich habe eine Million Images mit insgesamt 30 GB Festplattenspeicher, die von einem lokalen Verzeichnis in ein anderes lokales Verzeichnis verschoben werden müssen.

Was ist der effizienteste Weg? mv? cp? rsync? Etwas anderes? Tipps

/path/to/old-img-dir/* 00000000.jpg --------.jpg ## nearly 1M of them! ## ZZZZZZZZ.jpg 

Verschiebe sie hierher:

/path/to/new/img/dir/ 
10
Ich glaube nicht, dass Sie "mv" schlagen können, wenn Sie sowohl das Quellverzeichnis als auch das Zielverzeichnis im selben Dateisystem haben. Frédéric Hamidi vor 12 Jahren 4

8 Antworten auf die Frage

21
Richard

rsync wäre eine schlechte Wahl, da es eine Menge Client / Server-Hintergrundarbeit leistet, die sowohl lokale als auch entfernte Systeme berücksichtigt.

mvist wahrscheinlich die beste Wahl. Wenn möglich sollten Sie es mv directory_old directory_newlieber als versuchen mv directory_old/* directory_new/. Auf diese Weise bewegen Sie eine Sache statt einer Million Dinge.

+1 für den Rat, die Verzeichnisse anstelle der Dateien zu verschieben. Ex Umbris vor 12 Jahren 5
Plus, die Wildcard-Erweiterung würde wahrscheinlich die maximalen Argumente, die von "mv" unterstützt werden, durchbrechen, wenn wir über Millionen sprechen. slhck vor 12 Jahren 3
rsync kann problemlos auf lokalen Speichermedien übertragen werden. Es erzwingt Dinge wie - Whole-File (Entfernen der Implementierung des Delta-Xfer-Algorithmus) und verhindert andere Dinge wie - Compression, die bei lokalen Übertragungen keinen Zweck haben. Wenn sich die Verzeichnisse auf verschiedenen Dateisystemen befinden, bietet 'mv' keinerlei Leistung. Wenn sie sich auf demselben Dateisystem befinden, dann "mv" die Verzeichnisse wie diese Leute sagen. UtahJarhead vor 12 Jahren 5
Wenn viele Bilder vorhanden sind, wird bei Verwendung eines einfachen Shell-Platzhalters die maximale Befehlszeile überlaufen. Raúl Salinas-Monteagudo vor 7 Jahren 0
Beim Wechsel zwischen den Festplatten werden weiterhin alle Daten verschoben. Auf derselben Festplatte aktualisiert `mv` nur die Inode-Informationen, sodass` mv directory_old directory_new` schneller arbeitet als `mv directory_old / * directory_new` Anshul vor 6 Jahren 0
12
Raúl Salinas-Monteagudo
find src_image_dir/ -type f -name '*.jpg' -print0 | xargs -0r mv -t dst_image_dir/ 
  • Dadurch wird die Argumenterweiterung nicht überlaufen.
  • Sie können die Dateierweiterung angeben, wenn Sie möchten. (-Name ...)
  • find -print0Mit xargs -0können Sie Leerzeichen in den Namen verwenden.
  • xargs -rwird nicht ausgeführt, es mvsei denn, es ist etwas zu verschieben. ( mvwird sich beschweren, wenn keine Quelldateien angegeben werden).
  • Mit der Syntax mv -tkönnen Sie zuerst das Ziel und dann die Quelldateien angeben, die von benötigt werden xargs.
  • Das Verschieben des gesamten Verzeichnisses ist natürlich viel schneller, da es unabhängig von der Anzahl der darin enthaltenen Dateien in konstanter Zeit erfolgt, jedoch:
    • Das Quellverzeichnis verschwindet für einen Bruchteil der Zeit und kann Probleme verursachen.
    • Wenn der Prozess das aktuelle Verzeichnis als Ausgabeverzeichnis verwendet (im Gegensatz dazu, dass er sich immer auf einen vollständigen Pfad von einem nicht verschiebbaren Speicherort bezieht), müssten Sie ihn erneut starten. (wie Sie es mit der Protokollrotation tun ).

Ich würde mich übrigens fragen, ob ich wirklich so viele Dateien auf einmal verschieben muss. Die Stapelverarbeitung wird überschätzt. Ich versuche, nicht zu viel Arbeit anzusammeln, wenn ich die Dinge im Moment verarbeiten kann, in dem sie erzeugt werden.

Dies funktioniert gut genug, um Dateien zwischen Dateisystemen auf demselben Server zu verschieben. Gut genug, dass ich mir nicht die Mühe gemacht habe, eine Lösung in rsync zu finden. Sicher hat es ein oder zwei Stunden gedauert, aber es funktioniert. Beachten Sie, wenn Sie anstelle von "." Einen Verzeichnisnamen finden. - Achten Sie darauf, den abschließenden Schrägstrich im Suchbefehl zu verwenden, andernfalls wird das Verzeichnis im Ziel des Befehls mv neu erstellt. Speeddymon vor 7 Jahren 0
4
UtahJarhead

If the two directories reside on the same filesystem, use mv on the DIRECTORY and not the contents of the directory.

If they reside on two different filesystems, use rsync:

rsync -av /source/directory/ /destination

Notice the trailing / on the source. This means it will copy the CONTENTS of the directory and not the directory itself. If you leave the / off, it will still copy the files but they will sit in a directory named /destination/directory. With the /, the files will just be in /destination

rsync will maintain file ownership if you run it as root or if the files are owned by you. It will also maintain the mtime of each individual file.

Für das Kopieren eines großen Ordners von einer Festplatte auf eine andere Festplatte scheint "rsync" einen Kreis um "mv" zu bilden. Danke für den Tipp! leo-the-manic vor 11 Jahren 0
1
Serge

As both directory_old and directory_new are on the same filesystem you could use cp -l instead of mv as an option. cp -l will create a hard links to the original files. When you are done with 'move' and you satisfied with result then you can remove these files from directory_old. in terms of speed it will be same as 'mv' as you first create the links and then you remove the original ones. But this approach let you to start from the beginning if this makes sense

0
carlpett

Es hängt davon ab (tm). Wenn Ihr Dateisystem eine Kopie beim Schreiben ist, sollte die Kopie ( cpoder rsyncbeispielsweise) mit einer Verschiebung vergleichbar sein. In den meisten Fällen ist mves jedoch am schnellsten, dass move ( ) am schnellsten ist, da es einfach die Daten umschaltet, die beschreiben, wo eine Datei abgelegt wird (Hinweis: Dies ist zu stark vereinfacht).

Bei einer durchschnittlichen Linux-Installation würde ich also gehen mv.

BEARBEITEN: @ Frédéric Hamidi hat einen guten Punkt in den Kommentaren: Dies ist nur gültig, wenn sich beide auf demselben Dateisystem und auf derselben Platte befinden. Andernfalls werden die Daten trotzdem kopiert.

0
Nico

Um mindestens ~ 10k Dateien (keine Verzeichnisse) zu kopieren, beschwerte sich cp mit:

/ bin / cp kann nicht ausgeführt werden: Argumentliste zu lang

Die beste Option ist Rsync:

Rsync-Quellziel

Und es ging sehr schnell!

0
endolith

Wenn Sie über den freien Speicherplatz verfügen, archivieren Sie sie in einer einzelnen .tar-Datei (ohne Komprimierung ist schneller), verschieben Sie sie dann und entpacken Sie sie.

-1
maholt
tar cf - dir1 | (cd dir2; tar xf -)  tar cf - dir1 | ssh remote_host "( cd /path/to/dir2; tar xf - )" 

Wenn Sie 'cp' verwenden, führt jede Datei ein Öffnen-Lesen-Schließen-Öffnen-Schreiben-Schließen aus. Tar verwendet verschiedene Prozesse zum Lesen und Schreiben sowie mehrere Laufflächen, um mehrere Dateien gleichzeitig zu bearbeiten. Selbst bei einer einzelnen CPU-Box sind Multithread-Apps schneller.

Obwohl dies die Frage beantworten kann, wäre es eine bessere Antwort, wenn Sie eine Erklärung liefern könnten, warum dies so ist. DavidPostill vor 8 Jahren 2
Wenn sie sich auf dem lokalen Computer befinden, befinden sie sich wahrscheinlich im selben Dateisystem. Mit `tar c | tar x` kostet O (total_size) anstelle von O (file_count). Raúl Salinas-Monteagudo vor 7 Jahren 0