サイズ9,0KBの空のファイル(ゼロのみが含まれています)があり、別のファイル(サイズ1,1KB)を書き込む必要がありますが、最初のファイルのサイズまたは残りの内容が失われてはなりません。したがって、ファイル全体が00000000000000...
になっている場合は、2番目のファイルをそのファイルに書き込み、ゼロをそのままにしておく必要があります。 dd
を使用しようとしましたが、成功しませんでした。ファイルのサイズが変更されます。
dd if=out/one.img of=out/go.img
どうすればいいのか誰か知っていますか?
宛先ファイルの先頭を切り捨てずに上書きするには、notrunc
変換ディレクティブを指定します。
$ dd if=out/one.img of=out/go.img conv=notrunc
ソースファイルのデータappendedを宛先に送信したい場合は、seek
ディレクティブを使用してそれを行うことができます。
$ dd if=out/one.img of=out/go.img bs=1k seek=9
これは、ブロックサイズが1 kiBであることをdd
に通知するため、seek
は書き込みを行う前に9kiB進みます。
2つの形式を組み合わせることもできます。たとえば、ファイル内のsecond 1kiBブロックを1kiBソースで上書きするには:
$ dd if=out/one.img of=out/go.img bs=1k seek=9 conv=notrunc
つまり、出力ファイルの最初の1 kiBをスキップし、そこで見つかったデータを入力ファイルのデータで上書きしてから、最初に切り捨てずに出力を閉じます。
<>
を使用した切り捨てを使用した書き込み専用ではなく、>
シェルリダイレクト演算子を使用してターゲットファイルを読み取り/書き込みモードで開くだけです。
file2
の上にfile1
を書きたいと仮定します。
cat file2 1<> file1
これにより、オフセット0(先頭)でfile2
がfile1
に書き込まれます。
file2
の最後にfile1
を追加する場合は、>>
演算子を使用します。
cat file2 >> file1
file2
内の任意のオフセットにfile1
を次のように書き込むこともできます。
{ head -c1000 # for 1000 bytes within or
# head -n 10 # for 10 lines within
cat file2 >&0
} <> file1 > /dev/null
バイトオフセットの場合でも、ウォーレンのdd
ソリューションを使用する方が便利な場合があります。