Fehlenden Teil anfügen

Fehlenden Teil anfügen

Ich habe eine Datei mit einer Größe von foo.txt30 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 ddfunktionieren?

Antwort1

Zum Synchronisieren von Dateien rsyncgibt es die --appendOption „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 -Pund -vOptionen 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 bsx skipals auch obsx seekgleich 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 origfilenach newfileund überspringen dabei die ersten 30x 1MBlö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 splitBefehl verwenden, um die 60 GB große Datei in file1und aufzuteilen file2. Verwenden Sie dann , catum die gewünschten Teile wieder zusammenzusetzen.

Beispiel:

split -n2 60Gfile
cat xab >> 30Gfile

split -n2teilt die Datei in zwei Hälften und erstellt zwei Dateien mit den Namen xaaundxab

Wenn dies nicht das gewünschte Ergebnis bringt, lesen Sie das Split-Handbuch, da der Befehl andere Optionen hat.

verwandte Informationen