一般的な小さなファイルにddを使用できますか?

一般的な小さなファイルにddを使用できますか?

男性dd

dd - ファイルの変換とコピー

奇妙なことに、dd1バイトのテキストファイルはコピー後にはるかに小さくなります。

$ 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; 

dd1バイトのみコピーするように要求しています。ただし、デフォルトでは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

おすすめ記事