1TBの大きなファイル(破損したドライブのディスクイメージ)と1.3MBの小さなファイル(ディスクファイルの最初)があります。
小さなファイルの内容を使用して、大きなファイルの一部を上書きします。つまり、小さなファイルを使用して、1TBの画像の最初の1.3MBを挿入/上書きしたいと思います。
テストに小さな一時ファイルを使用して、ファイルの一部を上書きできませんでした。むしろ、ddはファイルを完全に上書きしました。これは私が望むものではありません。
Ddはこれを行うことができますか?
conv=notrunc
引数を使用する場合は、最初のバイトだけを置き換えることができます。
例えば。 dd conv=notrunc if=small.img of=large.img
root@debian:~/ddtest# dd if=/dev/zero of=file1.img bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 1.14556 s, 9.2 MB/s
root@debian:~/ddtest# dd if=/dev/urandom of=file2.img bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.207185 s, 5.1 MB/s
root@debian:~/ddtest# head file1.img
<< Blank space here as it's all Zeroes >>
root@debian:~/ddtest# dd conv=notrunc if=file2.img of=file1.img
2048+0 records in
2048+0 records out
1048576 bytes (1.0 MB) copied, 0.00468016 s, 224 MB/s
root@debian:~/ddtest# head file1.img
^�v�y�ے!� E�91���� << SNIP Random garbage >>
root@debian:~/ddtest#
ファイルの先頭のみを上書きし、残りをそのままにしたい場合は、 conv=notrunc
切り捨てを防ぐオプション:
dd conv=notrunc if=/dev/zero of=test bs=1024 count=1024
notrunc
手段 :
出力ファイルを切り捨てないでください。 ddユーティリティのこの呼び出しによって明示的に書き込まれていない出力ファイル内のブロックを保持します。
これはPOSIXにあり、dd
のすべてのバージョンでサポートされています。
例:
printf '\xa1' | dd conv=notrunc of=Yourfile bs=1 seek=$((0xoffset))
big-file
の-startをsmall-file
の内容で上書きし、残りに影響を与えたくない場合は、任意のBourneのようなシェルで実行できます。
cat small-file 1<> big-file
<>
リダイレクト演算子は、ファイルを切り捨てずに読み取り+書き込みモードで開きます。これは、dd
のconv=notrunc
を使用するのと同じですが、dd
のすべての問題と制限はありません。
ファイルの先頭以外の場所にコンテンツを書き込む場合は、ファイル内の目的の位置をシークする必要があります。 dd
とそのseek=xxx
が便利ですが、ksh93
やzsh
のような組み込みのシーク演算子を備えたシェルを使用することもできます。
cat small-file 1<> big-file >#((12345)) # ksh93
zmodload zsh/system; {sysseek -u1 12345 && cat small-file} 1<> big-file # zsh