![ddはファイルの一部を上書きできますか? [コピー]](https://linux33.com/image/40626/dd%E3%81%AF%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%B8%80%E9%83%A8%E3%82%92%E4%B8%8A%E6%9B%B8%E3%81%8D%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%81%8B%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
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-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
答え4
例:
printf '\xa1' | dd conv=notrunc of=Yourfile bs=1 seek=$((0xoffset))