Mann dd
:
dd - Konvertieren und Kopieren einer Datei
Ich tendiere dazu, zu verwenden dd
. Seltsamerweise wird die 1-Byte-Textdatei nach dem Kopieren viel kleiner:
$ block_size=1; device_to_edit=/media/ramdrive/a; device_from=/media/ramdrive/b; echo "aaaaaaaaaa">$device_to_edit; echo "bbbbbbbbbb">$device_from; cat $device_to_edit; cat $device_from; dd if=$device_from of=$device_to_edit count=1 seek=2 skip=2 bs=$block_size; cat $device_to_edit
aaaaaaaaaa
bbbbbbbbbb
1+0 records in
1+0 records out
1 byte copied, 0,000156688 s, 6,4 kB/s
aab
Es hieß 1 byte copied
: „Warum ist das Dateiende verschwunden?“
Hinzugefügt:
Wie im Kommentar vorgeschlagen, conv=notrunc
behebt es das Problem. Aber von man
:
conv=CONVS konvertiert die Datei gemäß der durch Kommas getrennten Symbolliste
Ich wollte keine Datei konvertieren. Als ich über das Kopieren von Blockgeräten gelesen habe, habe ich diesen Operanden nicht gesehen. Wird er immer benötigt, wenn nicht alle Dateien (z. B. ein 512-Byte-Block in /dev/sdb: USB-Festplatte) geändert werden?
Antwort1
Sie tun Folgendes:
block_size=1;
dd ... count=1 seek=2 skip=2 bs=$block_size;
Sie möchten dd
nur ein Byte kopieren. Standardmäßig wird die Ausgabedatei jedoch gekürzt, sodass das Dateiende dort steht, wo es dd
endet.
$ echo abcdefgh > test1
$ echo 12345678 > test2
$ dd count=1 bs=1 skip=2 seek=2 if=test1 of=test2
1+0 records in
1+0 records out
1 byte copied, 0.000179375 s, 5.6 kB/s
$ cat test2; echo
12c
Die GNU-Manpage, die ich habe, scheint das nicht explizit zu sagen, aberdie POSIX-Beschreibung:
of=file
Geben Sie den Ausgabepfadnamen an. [...] Wennseek=expr
angegeben ist, aberconv=notrunc
nicht, besteht der Effekt der Kopie darin, dass die Blöcke in der Ausgabedatei, in denen dd sucht, erhalten bleiben. Kein anderer Teil der Ausgabedatei soll jedoch erhalten bleiben. (Wenn die Größe des Suchvorgangs plus die Größe der Eingabedatei kleiner ist als die vorherige Größe der Ausgabedatei, wird die Ausgabedatei durch die Kopie gekürzt.[...])
Um dies zu verhindern, fügen Sie die conv=notrunc
Option hinzu:
notrunc
die Ausgabedatei nicht kürzen
$ echo 12345678 > test2
$ dd conv=notrunc count=1 bs=1 skip=2 seek=2 if=test1 of=test2
1+0 records in
1+0 records out
1 byte copied, 0.00019385 s, 5.2 kB/s
$ cat test2
12c45678
notrunc
bewirkt keine Änderung der tatsächlich kopierten Daten und handelt es sich daher in diesem Sinne nicht um eine „Konvertierung“, auch wenn es als Hinweis darauf verstanden wird conv
.
Beachten Sie, dass, wenn count=
angegeben ist, dd
genau so viele read()
Aufrufe ausgeführt werden. Das bedeutet, dass beim Lesen von einem Gerät, das kurze Lesevorgänge ausführen kann, die tatsächlich gelesene Datenmenge nicht count
mal beträgt bs
.
Antwort2
Hätte mir die vollständige Dokumentation ansehen sollen man dd
:
Full documentation at: <https://www.gnu.org/software/coreutils/dd>
or available locally via: info '(coreutils) dd invocation'
'of=FILE' Schreibt in DATEI statt in die Standardausgabe. Wenn nicht 'conv=notrunc' angegeben ist, kürzt 'dd' DATEI auf null Bytes (oder die mit 'seek=' angegebene Größe).