Einzelner Unix-Befehl, um eine große Datei korrekt zu übertragen?

4921
user13798

Ich versuche, eine große (~ 3 GB) Datei zwischen zwei Unix-Maschinen zu übertragen.

Ich kann scp oder rsync verwenden, aber manchmal ist die Übertragung beschädigt. (Ich muss manuell prüfen.) Ich kann die Datei in Stücke teilen und sie und die Prüfsumme übertragen und dann neu kombinieren. Dies ist jedoch langwierig.

Gibt es einen einzigen Befehl, um eine große Datei korrekt zwischen zwei Unix-Computern zu übertragen? Ich möchte, dass beide Kopien automatisch geprüft werden, und die Übertragung (oder Teile davon) so lange wiederholt werden, bis alle Bytes korrekt über die Leitung übertragen werden.

3

4 Antworten auf die Frage

7
Randy Orrison

Rsync arbeitet, indem es eine Datei in Blöcke unterteilt und die Blöcke nur dann überträgt, wenn sie sich unterscheiden. Es sollte in der Lage sein, Korruption zu erkennen und zu beheben. Haben Sie versucht, die Option --partial zu verwenden, die es fortsetzen lässt, wenn es unterbrochen wird, und den Befehl so oft wiederholt, bis keine Daten mehr übertragen werden?

Verwenden Sie einen Rsync-Server am fernen Ende der Verbindung? Wenn nicht, verwenden Sie rsync nicht wirklich zum Übertragen der Datei. Es wird nur die zugrunde liegende Transportmethode verwendet, so dass Sie keine Fehlererkennung erhalten.

Wenn Sie rsync verwenden, verwenden Sie rsync. Wenn kein Server-Daemon überwacht wird, versucht er, sich über SSH anzumelden, einen rsync-Prozess zu starten, der vorübergehend als "Server" -Ende fungiert, und das rsync-Protokoll mit dem SSH-Stream zu tunneln. Denken Sie daran: Wenn Sie rsync verwenden, um möglicherweise beschädigte Dateien mit einer (vermutlich) bekanntermaßen guten Originalkopie zu überprüfen, verwenden Sie die Option "--checksum", um zu erzwingen, dass der Inhalt aller Dateien überprüft wird, anstatt die Verknüpfung mit der gleichen Größe anzunehmen + Zeitstempel sind OK. David Spillett vor 14 Jahren 2
Das ist sehr wahr, es sei denn, er ist NFS oder SAMBA und hat die entfernte Festplatte als eine lokale Datei angegeben. In diesem Fall werden Beschädigungen unter NFS oder SAMBA nicht erkannt. Aber er hat nicht angegeben. Randy Orrison vor 14 Jahren 1
Es gibt NFS auf dem lokalen Client, aber ich kopiere durch rsync ssh auf den Remote-Client (der nicht NFS angehängt ist). user13798 vor 14 Jahren 0
In diesem Fall versuchen Sie --checksum wie von David Spillett vorgeschlagen. Das Skript von quack, das die md5sum übergibt, sieht ebenfalls gut aus. Randy Orrison vor 14 Jahren 0
6
randomx

Verwenden Sie die Option -c (Prüfsumme) in rsync.

rsync -azcvPh file1 user@remotehost:/tmp/ 

Die Option -P zeigt Statusstatistiken an und hilft Ihnen zu verstehen, wo und wann Ihre Dateiübertragung unterbrochen wird. Die -h macht es "lesbar" und die -z komprimiert.

-P impliziert auch - partial, und das ist auch in diesem Fall gut. amarillion vor 11 Jahren 0
3
knweiss

Sie verwenden die besten Befehle, aber Ihr Computer ist defekt. Ich empfehle dringend, memtest86 + über Nacht auf beiden Computern auszuführen, um den Arbeitsspeicher zu überprüfen.

Möglicherweise möchten Sie auch nach fehlerhaften Festplatten suchen ... retracile vor 14 Jahren 1
1
quack quixote

Sie können es immer zwischen den Hosts bittorrent machen, aber ich bin nicht sicher, wie ich es automatisieren kann.

Ich mache so etwas nicht oft, also würde ich es nicht schreiben. Stattdessen würde ich einen großen Einliner bauen, um die Arbeit zu erledigen. Technisch gesehen ist das also kein Befehl, sondern alles in einer Zeile. Es ist nicht schwer zu schreiben, wenn Sie dies häufig tun.

$ md5sum bigfile > bigfile.md5 ; export BIGFILE="notdone" ; while [ "$BIGFILE" eq "notdone" ] ; do rsync --checksum --partial bigfile* user@remotehost:path/to/put/it/in/ ; ssh user@remotehost "cd path/to/put/it/in/; md5sum -c < bigfile.md5" | grep -Ev 'OK$' | [ `wc -l` == "0" ] && BIGFILE="done" ; done 

Dies teilt sich auf in:

$ md5sum bigfile > bigfile.md5 ; \ # create our own checksum export BIGFILE="notdone" ; \ # set our check variable while [ "$BIGFILE" == "notdone" ]; do \ # recheck variable state after each pass rsync --checksum --partial bigfile* \ # call rsync to copy user@remotehost:path/to/put/it/in/ ; \ # and call ssh to check ssh user@remotehost \ # connect with ssh "cd path/to/put/it/in/; md5sum -c < bigfile.md5" \ # and run the check | grep -Ev 'OK$' \ # ignore good output | [ `wc -l` == "0" ] \ # if we didn't find one && BIGFILE="done" ; \ # set our get-out-of-jail card done \ # and we're done 

Sie müssen SSH einrichten, um sich bei Ihrem Host mit Schlüsselberechtigung anzumelden, um ihn ohne Interaktion auszuführen. Geben Sie in diesem Fall eine Echo-Anweisung ein, um Ihnen zu sagen, wo es sich befindet.

Getestet, aber ich gehe davon aus, dass die Rsync-Optionen optimiert werden könnten.