ddユーティリティを使用して出力ファイルで必要なバイト数をスキップするにはどうすればよいですか?

ddユーティリティを使用して出力ファイルで必要なバイト数をスキップするにはどうすればよいですか?

ddユーティリティを使用して、出力ファイルの特定の領域を入力ファイルに書き換えたいと思います。出力ファイルの最初の732618バイトをスキップし、そこから708800バイトの書き込みを開始する必要があります。入力バイトをスキップする方法だけが見つかりました。ファイルが見つかりましたが、出力ファイルに情報が見つかりませんでした。スキップする方法、ddを使用して実行できますか?

答え1

マニュアルページには次のように記載されています。

seek=NN 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

関連情報