ddユーティリティを使用して、出力ファイルの特定の領域を入力ファイルに書き換えたいと思います。出力ファイルの最初の732618バイトをスキップし、そこから708800バイトの書き込みを開始する必要があります。入力バイトをスキップする方法だけが見つかりました。ファイルが見つかりましたが、出力ファイルに情報が見つかりませんでした。スキップする方法、ddを使用して実行できますか?
答え1
マニュアルページには次のように記載されています。
seek=N
N
obs
出力開始時にサイズチャンクをスキップする
conv=notrunc
出力を切り捨てたくない場合もあります。
$ echo abcdefghijkl > foo.txt
$ echo -n XYZ | dd bs=1 seek=3 of=foo.txt conv=notrunc
3+0 records in [...]
$ cat foo.txt
abcXYZghijkl
ちなみに、bs=1
上記のように使用すると、読み書きするバイトごとにシステムコールを発行するので、write()
速度が遅くなります。obs
しかし、私が知っている限り、dd
部分書き込みを再試行しないため、完全な732618に設定しません。
GNU ddを使用すると、oflag=seek_bytes
ルックオフセットをバイトとして追加および指定でき、より合理的なブロックサイズを可能にします。
またはPerlを使って探します。
$ echo abcdefghijkl > foo.txt
$ echo -n XYZ | ( perl -e 'sysseek STDOUT, 3, 0;'; cat ) 1<> foo.txt
$ cat foo.txt
abcXYZghijkl