ファイルの先頭と末尾にゴミ (バイナリ ヘッダーとフッター) があるファイルがあります。これらのバイトを削除する方法を知りたいです。例として、先頭から 25 バイトと仮定します。そして、末尾から 2 バイトです。
truncate と dd を使用できることはわかっていますが、truncate はストリームでは機能せず、ハード ファイルで 2 つのコマンドを実行するのは少々不格好に思えます。 がtruncate
ファイルの大きさを認識して、ファイルを に cat できればもっと便利ですdd
。または、これを行うもっと良い方法はありますか?
答え1
答え2
ddは、1 つのコマンドで両方を実行します。ブロック サイズを 1 バイトに設定し、最初の 25 バイトをスキップし、スキップ バイトと終了バイトを引いたファイル サイズをカウントします。
100 byte file
file.img
dd if=./file.img of=./trimed_file.img bs=1 skip=25 count=73
数字は 0 からカウントされる可能性があるため、再度確認してください。
答え3
ksh93の場合:
{ head -c "$n"; } < file <#((n = EOF - 25 - 2 , 25))
または、インプレースで実行する場合は次のようにします。
{ head -c "$n"; } < file <#((n = EOF - 25 - 2 , 25)) 1<>; file
/opt/ast/bin
より先にを持っている場合は$PATH
、組み込みを取得しますhead
。
<#((...))
はlseek()
演算子です。...
は算術式として解釈され、 はEOF
ファイルの長さです。 つまり、上記では、表示する部分の長さを割り当て$n
、ファイル内の 25 バイトをシークしています。<>;
読み取り + 書き込みモードで開き、コマンドが成功した場合は切り捨てるリダイレクト演算子です。