ddはファイルの一部を上書きできますか? [コピー]

ddはファイルの一部を上書きできますか? [コピー]

1TBの大容量ファイル(破損したドライブのディスクイメージ)と1.3MBの小さなファイル(ディスクファイルの先頭)があります。

小さなファイルの内容を使って大きなファイルの内容の一部を上書きしたいと思います。つまり、1TBイメージの最初の1.3MBを小さなファイルに挿入/上書きしたいのです。

小さな一時ファイルでテストすると、ファイルの一部を上書きできません。代わりに、ddはファイルを完全に上書きします。これは私が望むものではありません。

ddはこれを行うことができますか?

答え1

このパラメータを使用すると、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# 

答え2

ファイルの先頭のみを上書きし、残りを変更したくない場合は、次のようにします。conv=notrunc切り捨てを防ぐオプション:

dd conv=notrunc if=/dev/zero of=test bs=1024 count=1024

notrunc 方法:

出力ファイルを切り捨てないでください。この呼び出しによって明示的に書き込まれなかったブロックを出力ファイルに保存します。DD便利です。

POSIX形式なので、すべてのバージョンがサポートされていますdd

答え3

上書きしたい場合スタートbig-file残りの部分に影響を与えることなく、small-fileBourneに似たシェルを使用してこれを実行できます。

cat small-file 1<> big-file

リダイレクト<>演算子は、ファイルを切り捨てずに読み取り+書き込みモードで開きます。これはdd'を使用するのと同じですconv=notruncが、すべての問題や制限はありませんdd

ファイルの先頭以外の場所に何かを書きたい場合は、ファイル内の目的の場所を確認する必要があります。またはなどの組み込み検索演算子でシェルを使用することもできますが、これはdd便利な場所です。seek=xxxksh93zsh

cat small-file 1<> big-file >#((12345)) # ksh93

zmodload zsh/system; {sysseek -u1 12345 && cat small-file} 1<> big-file # zsh

答え4

例:

printf '\xa1' | dd conv=notrunc of=Yourfile bs=1 seek=$((0xoffset))

関連情報