男性dd
:
dd - ファイルの変換とコピー
奇妙なことに、dd
1バイトのテキストファイルはコピー後にはるかに小さくなります。
$ 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
1 byte copied
ファイルの終わりが消えるのはなぜですか?
次に追加:
コメントで提案したとおりにconv=notrunc
編集してください。しかし、以下からman
:
conv=CONVS は、カンマ区切り記号のリストに基づいてファイルを変換します。
ファイルを変換したくありません。ブロックデバイスのコピーについて読み取ったときにこのオペランドを表示できませんでした。すべてのファイル(例:/ dev / sdb:USBディスクの512バイトブロック)が変更されない場合は常に必要ですか?
ベストアンサー1
あなたがしていることは次のとおりです。
block_size=1;
dd ... count=1 seek=2 skip=2 bs=$block_size;
dd
1バイトのみコピーするように要求しています。ただし、デフォルトではdd
ファイルの終わりに完了するように出力ファイルを切り捨てます。
$ 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
私のGNUのマンページにはこの内容が明示的に示されていないようです。POSIXの説明は:
of=file
出力パス名を指定します。 [...]seek=expr
指定したが指定しなかったconv=notrunc
場合、コピー効果はddクエリの出力ファイル内のブロックを保存する必要がありますが、出力ファイルの他の部分は保存しないでください。 (検索サイズに入力ファイルサイズを加えた値が前の出力ファイルサイズより小さい場合は、出力ファイルをコピーして減らす必要があります。[...])
これを防ぐには、conv=notrunc
次のオプションを追加してください。
notrunc
出力ファイルを切り捨てないでください。
$ 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
実際にコピーされたデータを変更しないのでconv
。
count=
与えられた場合、dd
複数のread()
呼び出しが実行されます。つまり、短い読み取りを提供できるデバイスから読み取る場合、実際に読み取ったデータの量はcount
何度もありませんbs
。