Ich habe eine Datei mit einer Größe von foo.txt
30 GiB auf meinem Backup-Laufwerk.
Ich habe eine Datei auf meinem normalen Laufwerk foo.txt
(60 GiB, die ersten 30 GiB sind garantiert exakt gleich).
Wie kann ich nur den fehlenden Teil anhängen, ohne die ganze Datei erneut zu kopieren?
Vielleicht würde etwas mit dd
funktionieren?
Antwort1
Zum Synchronisieren von Dateien rsync
gibt es die --append
Option „Daten an kürzere Dateien anhängen“:
rsync --append /path/to/foo.txt /path/to/foo.txt
# ^- original ^- copy
Beispielausführung
Testszenario dreist aus der Antwort von Steeldriver kopiert – ich habe die -P
und -v
Optionen für eine ausführliche Ausgabe hinzugefügt.
$ dd if=/dev/urandom bs=1M iflag=fullblock count=60 of=origfile
60+0 records in
60+0 records out
62914560 bytes (63 MB, 60 MiB) copied, 0.328983 s, 191 MB/s
$ dd if=origfile bs=1M iflag=fullblock count=30 of=newfile
30+0 records in
30+0 records out
31457280 bytes (31 MB, 30 MiB) copied, 0.0292976 s, 1.1 GB/s
$ cmp origfile newfile
cmp: EOF on newfile
$ rsync -Pv --append origfile newfile
origfile
62,914,560 100% 365.47MB/s 0:00:00 (xfr#1, to-chk=0/1)
sent 31,465,039 bytes received 35 bytes 20,976,716.00 bytes/sec
total size is 62,914,560 speedup is 2.00
$ cmp origfile newfile
$
Antwort2
Ja, Sie können verwenden dd
- der Trick besteht darin, sowohl bs
x skip
als auch obs
x seek
gleich dem zu wählengenauerforderlicher Versatz
Ex.
Lassen Sie uns zunächst eine Testdatei erstellen. Zur Veranschaulichung habe ich 60 MiB statt 60 GiB gewählt:
$ dd if=/dev/urandom bs=1M iflag=fullblock count=60 of=origfile
60+0 records in
60+0 records out
62914560 bytes (63 MB, 60 MiB) copied, 0.376846 s, 167 MB/s
Kopieren wir nun genau die erste Hälfte davon - wieder mit dd
(obwohl das nicht erforderlich ist)
$ dd if=origfile bs=1M iflag=fullblock count=30 of=newfile
30+0 records in
30+0 records out
31457280 bytes (31 MB, 30 MiB) copied, 0.063891 s, 492 MB/s
Überprüfen Sie, ob sie unterschiedlich sind:
$ cmp origfile newfile
cmp: EOF on newfile after byte 31457280, in line 122106
Kopieren wir nun von origfile
nach newfile
und überspringen dabei die ersten 30
x 1M
Blöcke beider Dateien:
$ dd if=origfile bs=1M iflag=fullblock skip=30 count=30 of=newfile seek=30
30+0 records in
30+0 records out
31457280 bytes (31 MB, 30 MiB) copied, 0.0632964 s, 497 MB/s
Überprüfen Sie abschließend, ob die Dateien jetzt identisch sind:
$ cmp origfile newfile
$
Antwort3
Das ist eine riesige Datei, aber wenn es die Größe bewältigen kann, können Sie den split
Befehl verwenden, um die 60 GB große Datei in file1
und aufzuteilen file2
. Verwenden Sie dann , cat
um die gewünschten Teile wieder zusammenzusetzen.
Beispiel:
split -n2 60Gfile
cat xab >> 30Gfile
split -n2
teilt die Datei in zwei Hälften und erstellt zwei Dateien mit den Namen xaa
undxab
Wenn dies nicht das gewünschte Ergebnis bringt, lesen Sie das Split-Handbuch, da der Befehl andere Optionen hat.