Kann dd für normale kleine Dateien verwendet werden?

Kann dd für normale kleine Dateien verwendet werden?

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=notruncbehebt 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 ddnur ein Byte kopieren. Standardmäßig wird die Ausgabedatei jedoch gekürzt, sodass das Dateiende dort steht, wo es ddendet.

$ 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. [...] Wenn seek=exprangegeben ist, aber conv=notruncnicht, 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=notruncOption 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

notruncbewirkt 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, ddgenau 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 countmal 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).

verwandte Informationen