男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 つ) が変更されていない場合は、常に必要ですか?
答え1
あなたがやっていることはこれです:
block_size=1;
dd ... count=1 seek=2 skip=2 bs=$block_size;
1 バイトだけコピーするように要求していますdd
。ただし、デフォルトでは出力ファイルが切り捨てられ、ファイルの終わりが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
。
答え2
完全なドキュメントを見るべきでしたman dd
。
Full documentation at: <https://www.gnu.org/software/coreutils/dd>
or available locally via: info '(coreutils) dd invocation'
'of=FILE' 標準出力の代わりに FILE に書き込みます。'conv=notrunc' が指定されていない限り、'dd' は FILE を 0 バイト (または 'seek=' で指定されたサイズ) に切り捨てます。