Einen großen Verzeichnisbaum lokal kopieren? cp oder rsync?


230

Ich muss einen großen Verzeichnisbaum kopieren, etwa 1,8 TB. Es ist alles lokal. Aus Gewohnheit würde ich verwenden rsync, aber ich frage mich, ob es viel Sinn gibt und ob ich lieber verwenden sollte cp.

Ich mache mir Sorgen um Berechtigungen und uid / gid, da diese in der Kopie erhalten bleiben müssen (ich weiß, dass rsync dies tut). Sowie Dinge wie Symlinks.

Das Ziel ist leer, sodass ich mich nicht darum kümmern muss, einige Dateien bedingt zu aktualisieren. Es ist alles eine lokale Festplatte, so dass ich mich nicht um ssh oder das Netzwerk kümmern muss.

Der Grund, warum ich versucht bin, mich von rsync zu lösen, ist, dass rsync möglicherweise mehr tut, als ich brauche. rsync prüfsummen dateien. Ich brauche das nicht und befürchte, dass es länger dauern könnte als cp.

Also, was denkst du, rsyncoder cp?


2
Wenn rsync genau das tut, was Sie möchten, wenn Sie mit seiner Verwendung für diese bestimmte Anwendung bereits vertraut sind und wenn es schnell genug funktioniert, um Ihren Geschmack zu treffen, warum um alles in der Welt möchten Sie dann wechseln?
Elf81

2
Weil ich befürchte, dass rsync länger dauert als cp, da rsync viele Prüfsummen durchführt, die cp nicht durchführt
Rory

1
Der CPU-Overhead der Prüfsumme ist im Vergleich zum Festplatten- / Netzwerk-I / O gering. Es sei denn, die Festplatte befindet sich auf demselben System und das Betriebssystem kann eine clevere Laufwerkskopie im Buscontroller ausführen.
Martin Beckett

3
Die Prüfsumme wird für Dateien erstellt, die sich in der Größen- und Zeitstempelprüfung unterscheiden. Wenn Sie paranoid sind (wie nach einem Stromausfall während des Kopierens), können Sie eine Prüfsumme für alle Dateien erzwingen. Bei einer lokalen Übertragung ist dies normalerweise langsamer als bei einem Neustart.
Korkman

3
Vielleicht ist er neugierig darauf, seinen Workflow zu verbessern, und steckt seinen Kopf nicht in den Sand, weil er glaubt, alles zu wissen. Dieser Kommentar nervt mich wirklich.
Martin Konecny

Antworten:


204

Ich würde rsync verwenden, da dies bedeutet, dass Sie es ohne großen Aufwand neu starten können, wenn es aus irgendeinem Grund unterbrochen wird. Mit rsync kann sogar ein Teil einer großen Datei neu gestartet werden. Wie andere erwähnen, kann es Dateien leicht ausschließen. Der einfachste Weg, die meisten Dinge zu bewahren, ist die Verwendung des -aFlags "Archiv". Damit:

rsync -a source dest

Obwohl UID / GID und Symlinks von -a(see -lpgo) beibehalten werden , impliziert Ihre Frage, dass Sie möglicherweise eine vollständige Kopie der Dateisysteminformationen wünschen . und -aenthält keine Hardlinks, erweiterten Attribute oder ACLs (unter Linux) oder die oben genannten oder Resource Forks (unter OS X). Daher müssen Sie für eine robuste Kopie eines Dateisystems diese Flags einschließen:

rsync -aHAX source dest # Linux
rsync -aHE source dest  # OS X

Der Standard-CP wird erneut gestartet, obwohl das -uFlag "nur kopiert, wenn die SOURCE-Datei neuer ist als die Zieldatei oder wenn die Zieldatei fehlt" . Das -a(Archiv-) Flag ist rekursiv und kopiert keine Dateien erneut, wenn Sie neu starten und die Berechtigungen beibehalten müssen. Damit:

cp -au source dest

5
Das Flag -u von cp ist wahrscheinlich nicht die beste Lösung, da es eine teilweise kopierte / beschädigte Datei nicht erkennt. Das Schöne an rsync ist, dass Sie md5 die Dateien summieren lassen können, um Unterschiede zu erkennen.
Chad Huneycutt

3
Das Hinzufügen der Option -w (--whole-file) beschleunigt eine unterbrochene Synchronisierung, da die Datei nur kopiert wird, anstatt eine Prüfsumme zu bilden.
Hayalci

13
Tatsächlich erkennt rsync lokale Übertragungen und aktiviert das Kopieren ganzer Dateien, ohne dass automatisch eine Prüfsumme erstellt wird.
Korkman

22
und - Fortschritt, der wirklich praktisch ist!
Matt

12
-P oder --progress zeigt den Fortschritt für jede Datei einzeln an. Es ist nützlich zum Kopieren großer Dateien, nicht für viele (Tausende) kleine Dateien, da es viel mehr Ausgabe bedeutet, die Sie nicht lesen können. Der Gesamtfortschritt aller Dateien wird nicht angezeigt.
SPRBRN,

106

Beim Kopieren in das lokale Dateisystem verwende ich immer die folgenden rsync-Optionen:

# rsync -avhW --no-compress --progress /src/ /dst/

Hier ist meine Argumentation:

-a is for archive, which preserves ownership, permissions etc.
-v is for verbose, so I can see what's happening (optional)
-h is for human-readable, so the transfer rate and file sizes are easier to read (optional)
-W is for copying whole files only, without delta-xfer algorithm which should reduce CPU load
--no-compress as there's no lack of bandwidth between local devices
--progress so I can see the progress of large files (optional)

Ich habe 17% schnellere Übertragungen mit den obigen rsync-Einstellungen über den folgenden tar-Befehl gesehen, wie in einer anderen Antwort vorgeschlagen:

# (cd /src; tar cf - .) | (cd /dst; tar xpf -)

1
Ich habe folgenden Fehler: rsync: --no-compress: unknown option@Ellis Percival.
alper

Das blitzt schnell. Schneller als rm -rf /src/.
dgo

2
Wie bei @alper war --no-compress für meine Version von rsync (in CentOS 7) keine Option. Ich habe stattdessen --compress-level = 0 verwendet.
Paul

79

Wenn ich eine große Datenmenge kopieren muss, verwende ich normalerweise eine Kombination aus tar und rsync. Der erste Durchgang ist es, es zu tarieren, etwa so:

# (cd /src; tar cf - .) | (cd /dst; tar xpf -)

Normalerweise gibt es bei einer großen Anzahl von Dateien einige, die tar aus irgendeinem Grund nicht verarbeiten kann. Möglicherweise wird der Vorgang unterbrochen, oder wenn es sich um eine Dateisystemmigration handelt, möchten Sie möglicherweise die Erstkopie vor dem eigentlichen Migrationsschritt erstellen. Jedenfalls führe ich nach der Erstkopie einen rsync-Schritt durch, um alles zu synchronisieren:

# cd /dst; rsync -avPHSx --delete /src/ .

Beachten Sie, dass der abschließende Schrägstrich /src/wichtig ist.


6
+1 Ich habe festgestellt, dass tar für große Kopien im Allgemeinen schneller ist als rsync. Mir gefällt auch die Idee, mit einem finalen Rsync fertig zu werden.
Geoff Fritz

2
tar ist eine gute Wahl, wenn das Zielverzeichnis leer ist. Obwohl mein Weg wäre: cd $ DSTDIR; tar c -C $ SRCDIR. | tar
asdmin

19
Das ist das Schöne an dieser Methode. Sie brauchen nicht den doppelten Speicherplatz, da Sie nie eine Zwischentar-Datei erstellen. Der Teer vor der Pipe packt die Daten und überträgt sie auf stdout, und der Teer nach der Pipe packt sie aus stdin und entpackt sie.
Chad Huneycutt

4
Ich habe eine cp -a für eine 12-GB-Übertragung und diese Methode für eine 42-GB-Übertragung durchgeführt. Die Teermethode dauerte ungefähr 1/4 der Zeit.
NGaida

3
Ich stelle mich auch pvin die Mitte, um den Fortschritt beobachten zu können und die Größe aller Daten unter Verwendung von zu schätzen df. Ich habe auch verwendet --numeric-owner, da die tartar -C /old-path --numeric-owner -S -c . | pv -tpeba -s 100G | tar -C /new-path --numeric-owner -S -xp
Petr Pudlák

14

rsync

Hier ist das von mir verwendete rsync, ich bevorzuge cp für einfache Befehle, nicht dieses.

$ rsync -ahSD --ignore-errors --force --delete --stats $SRC/ $DIR/

cpio

Hier ist ein Weg, der noch sicherer ist, cpio. Es ist ungefähr so ​​schnell wie Teer, vielleicht etwas schneller.

$ cd $SRC && find . -mount -depth -print0 2>/dev/null | cpio -0admp $DEST &>/dev/null

Teer

Dies ist auch gut und setzt sich bei Lesefehlern fort.

$ tar --ignore-failed-read -C $SRC -cf - . | tar --ignore-failed-read -C $DEST -xf -

Beachten Sie, dass dies alles nur für lokale Kopien ist.


Warum verwenden Sie die Flags -S und -D für rsync?
Miyalys

7

Was auch immer Sie bevorzugen. Vergessen Sie den -aSchalter nicht, wenn Sie sich für die Verwendung entscheiden cp.

Wenn Sie wirklich eine Antwort brauchen: Ich würde rsync verwenden, weil es viel flexibler ist. Müssen Sie das System herunterfahren, bevor der Kopiervorgang abgeschlossen ist? Drücken Sie einfach die Tastenkombination Strg-C und fahren Sie fort, sobald Sie zurück sind. Müssen Sie einige Dateien ausschließen? Verwenden Sie einfach --exclude-from. Müssen Sie Eigentümer oder Berechtigungen ändern? rsync erledigt das für Sie.


Was macht das -p Flag nochmal?
Rory

1
Es werden Eigentumsrechte, Zeitstempel und Berechtigungen des Servers beibehalten.
Uhr

5
cp -a wäre besser.
David Pashley

Tatsächlich. Antwort entsprechend geändert.
Uhr

7

Der rsyncBefehl berechnet immer Prüfsummen für jedes übertragene Byte.

Die Befehlszeilenoption --checksumbezieht sich nur darauf, ob Prüfsummen von Dateien verwendet werden, um zu bestimmen, welche Dateien übertragen werden sollen oder nicht, dh:

-c, --checksum Überspringen basierend auf Checksumme, nicht Mod-Zeit & Größe "

Die Manpage sagt auch Folgendes:

Beachten Sie, dass rsync immer überprüft, ob jede übertragene Datei auf der empfangenden Seite korrekt rekonstruiert wurde, indem die Prüfsumme für die gesamte Datei überprüft wird aktualisiert werden?" prüfen.

rsyncBerechnet also auch immer eine Prüfsumme der gesamten Datei auf der Empfängerseite, selbst wenn die -c/ --checksumOption "aus" ist.


14
Während Ihr Beitrag hier einige interessante Informationen hinzufügte, verringern die Beschimpfungen und Beleidigungen den Wert Ihres Beitrags. Diese Seite ist kein Forum für unkonstruktive Beschimpfungen. Wenn Sie die Quelle ändern konnten, haben Sie Ihre Änderungen als Patch eingereicht? Hast du deine Version auf Github oder so gepostet? Wenn Sie dies so stark empfinden, ist es möglicherweise besser, wenn Sie versuchen, etwas Konstruktiveres zu tun, anstatt unnötig zu beleidigen.
Zoredache

Ja, der letzte Absatz war nicht wirklich notwendig.
Sherwin Flug

6

rsync -aPhW --protocol=28beschleunigt diese großen Kopien mit RSYNC. Ich gehe immer rsync, weil der Gedanke, mitten in 90GiB zu sein und es zu brechen, mich von CP abschreckt


2
Welchen Wert hat die Verwendung des älteren Protokolls in dieser Befehlszeichenfolge?
ewwhite

1
Auf einem Mac hängt die ältere Version von Rsync, die ausgeliefert wurde, von einigen neueren Rsync-Protokoll-Revisionen ab, z.
Oneguynick

Ich vermute, die Nummer 28 ist nicht mehr gültig?
SPRBRN

5

rsync ist großartig, hat jedoch Probleme mit sehr großen Verzeichnisbäumen, da die Bäume im Speicher gespeichert werden. Ich habe nur gesucht, ob sie dieses Problem beheben würden, als ich diesen Thread gefunden habe.

Ich fand auch:

http://matthew.mceachen.us/geek/gigasync/

Sie können den Baum auch manuell aufteilen und mehrere rsyncs ausführen.


12
Wenn Sie Version 3 verwenden, wird nicht der gesamte Baum im Speicher behalten, wenn er groß ist. Es wird ein inkrementeller Rekursionsalgorithmus verwendet: samba.org/ftp/rsync/src/rsync-3.0.0-NEWS
Kyle Brandt

5

Dieser Thread war sehr nützlich und da es so viele Optionen gab, um das Ergebnis zu erzielen, entschied ich mich, einige davon zu vergleichen. Ich glaube, meine Ergebnisse können hilfreich sein, um zu verstehen, was schneller funktioniert hat.

Um 532 GB an Daten zu verschieben, die auf 1.753.200 Dateien verteilt waren, hatten wir folgende Zeiten:

  • rsync dauerte 232 Minuten
  • tar dauerte 206 Minuten
  • cpio dauerte 225 Minuten
  • rsync + parallel dauerte 209 Minuten

In meinem Fall habe ich es vorgezogen, zu verwenden rsync + parallel. Ich hoffe, diese Informationen helfen mehr Menschen, sich für eine dieser Alternativen zu entscheiden.

Der vollständige Benchmark wird hier veröffentlicht


404 Seite nicht gefunden
Amedee Van Gasse

1
Thanks @AmedeeVanGasse Die URL wurde kurz nach Ihrer Meldung
korrigiert

Warum kein Benchmarking cp? Dies ist der Titel der Frage!
Calandoa

@calandoa Ich denke, cpist unsicher, dh: Wenn es bricht müssen Sie von vorne beginnen, das ist, wie ich Optionen bevorzugen, die wieder aufgenommen werden können, also rsyncist mein Favorit :)
Arjones

3

Beim lokalen Kopieren eines lokalen Verzeichnisses ist "cp -van src dest" meiner Erfahrung nach 20% schneller als rsync. Was die Neustartfähigkeit betrifft, ist dies das, was "-n" tut. Sie müssen nur die teilweise kopierte Datei rm. Nicht schmerzhaft, es sei denn, es ist eine ISO oder eine solche.


2

ARJ IST SO ALTE SCHULE !! Ich bezweifle wirklich, dass ARJ und / oder Rsync Leistung geben werden.

Auf jeden Fall benutze ich immer cpio:

find . -print | cpio -pdm /target/folder

Dies ist fast schneller als CP, definitiv schneller als Teer und ohne etwas zu leiten.


2
"Die Original-Hilfsprogramme cpio und find wurden von Dick Haight während der Arbeit in der Unix-Support-Gruppe von AT & T geschrieben. Sie erschienen erstmals 1977 in PWB / UNIX 1.0" - der cpioManpage von FreeBSD .
Chris S

3
cpioLeider hat eine 8GB Obergrenze für Dateien.

" ohne etwas zu pfeifen ". Mit der Ausnahme, dass der findBefehl, wie Sie ihn aufgeführt haben, eine Pipe enthält:find . -print | cpio -pdm /target/folder
warren

1

Sie möchten rclone auf jeden Fall ausprobieren. Dieses Ding ist schnell verrückt:

sudo rclone sync /usr /home/fred/temp -P -L --transfers 64

Transferred:       17.929G / 17.929 GBytes, 100%, 165.692 MBytes/s, ETA 0s
Errors:                75 (retrying may help)
Checks:            691078 / 691078, 100%
Transferred:       345539 / 345539, 100%
Elapsed time:     1m50.8s

Dies ist eine lokale Kopie von und zu einer LITEONIT LCS-256 (256 GB) SSD.

Sie können --ignore-checksumden ersten Lauf hinzufügen , um ihn noch schneller zu machen.



0

tar würde auch die Arbeit machen, aber nicht wieder unterbrochen werden, wie Rsync wird.


Eine alte Antwort, aber ist TAR nicht dafür geeignet, komprimierte Archive von Dateien zu erstellen? Wie könnte es verwendet werden, um Dateien wie rsync oder cp zu übertragen?
Sherwin Flug

@SherwinFlight CD-Quelle; tar cf -. | (cd dest; tar xf -)
pgs

0

Was ist, wenn Sie ARJ verwenden?

arj a -jm -m1 -r -je filepack /source

Wo -jm -m1sind Komprimierungsstufen und -jemacht es eine ausführbare Datei. Jetzt haben Sie eine gekapselte Bash von Dateien.

Dann zur Extraktion auf die Zielkarte

filepack -y  

wo die Quellkarte erstellt wird (wo -ywird immer akzeptiert, überschrieben, übersprungen usw.)

Man kann dann das Dateipaket zum Zielbereich scp ftp und es ausführen, wenn das möglich ist.


1
Arj? Ist das nicht in den 80ern ausgestorben?
Michael Hampton

Vielleicht in den frühen 90ern, wenn Sie glauben, Wikipedia
Matt

0

Es gibt einige Beschleunigungen, die angewendet werden können rsync:

Vermeiden

  • -z/ --compress: Komprimierung lädt nur die CPU, da die Übertragung nicht über ein Netzwerk, sondern über RAM erfolgt.
  • --append-verify: Eine unterbrochene Übertragung fortsetzen. Das klingt nach einer guten Idee, hat aber den gefährlichen Fehlerfall: Jede Zieldatei, deren Größe (oder größer) der der Quelle entspricht, wird ignoriert. Außerdem wird die gesamte Datei am Ende mit einer Prüfsumme versehen, was bedeutet, dass --no-whole-filebeim Hinzufügen eines gefährlichen Fehlerfalls keine signifikante Beschleunigung erfolgt .

Verwenden

  • -S/ --sparse: Folgen von Nullen in spärliche Blöcke verwandeln
  • --partialoder -Pwelche ist --partial --progress: Speichern Sie alle teilweise übertragenen Dateien für die zukünftige Wiederaufnahme. Hinweis: Dateien haben keinen temporären Namen. Vergewissern Sie sich daher, dass das Ziel von niemand anderem verwendet wird, bis die gesamte Kopie abgeschlossen ist.
  • --no-whole-fileDamit alles, was erneut gesendet werden muss, Delta-Transfer verwendet. Das Lesen der Hälfte einer teilweise übertragenen Datei ist oft viel schneller als das erneute Schreiben.
  • --inplace Vermeiden des Kopierens von Dateien (aber nur, wenn das Ziel erst nach Abschluss der gesamten Übertragung gelesen wird)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.