2つのリンクファイルの分割

2つのリンクファイルの分割

私はAfile同等の仕事をしましたcat a.gif b.7z > Afile

Afile元のファイルa.gifb.7zファイルに分割する方法は?

答え1

gifが終わり、7zが始まる場所を特定する必要があります。

gifファイルの元のサイズがわからない場合は、7z文字で始まるファイルの先頭を参照できます7z

運が良ければ:

grep -boa 7z Afile

(GNUがgrep非標準-bbyteオフセット)を実装または準拠していると仮定すると、-oo一致する部分のみ出力)-aaテキスト以外のファイルを含むすべてのファイル))、次のいずれかが返されます。

<offset>:7z

<offset>ファイルの先頭までファイルの7zオフセットになります。

その後、次のように抽出できます。

tail -c +<offset+1> Afile > b.7z
head -c <offset> Afile > a.gif

たとえば、grepを返す場合とを1234:7z実行します。tail -c +1235 Afile > b.7zhead -c 1234 > a.gif

複数が返されると、grepそのうちの1つは7zファイルの先頭になり、残りは70x37 0x7a(ASCIIセット合計文字値)バイトシーケンスを含むgifまたは7zファイルになります。z

どちらが正しいかを確認するには、正しい出力に似たものを返す必要があるtail -c各出力をパイプできます。または内容をリストしてみてください。file -7-zip archive databsdtar tf -

tail -c +<offset+1> Afile | file -
tail -c +<offset+1> Afile | bsdtar tf -

これbinwalkユーティリティを使用すると、ファイル内のファイル形式の署名を見つけようとしたときにプロセスを自動化できます(通常はファームウェアイメージから情報を抽出するために使用されます)。

$ binwalk Afile

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             GIF image data, version "89a", 584 x 137
8570          0x217A          7-zip archive data, version 0.4

理想的には、@Henrikがコメントで指摘したように、GIFデータが終わる場所に関する情報を取得するには、gifセクションのメタデータを調べる必要があります。 ImageMagick identify、GNU extract、perl、および画像情報を報告する一般的なツールを確認しましたが、残念ながらImage::Infoexiftoolそれらのどれもその情報を報告していません。

研究を通じて手動で実行可能GIF画像フォーマット仕様もう1つのアプローチは、画像ビューアまたはコンバータに接続して、ファイルの解析中にファイルの読み取りが停止する場所を確認することです。

giftopnm私はすぐにそれを行うことができる古代のnetpbmソフトウェアを見つけました。 zshから:

zmodload zsh/system
{
  giftopnm > /dev/null
  head -c $(( systell(0) )) < Afile > a.gif
  cat > b.7z
} < Afile

私のテストでは、giftopnmpnmに変換した後、gifファイルの末尾の位置がstdinに残ります(ここでは削除します)。

データ終了後にgifに追加情報がないと仮定すると、これは奇妙には見えません。たとえば、gallery/htmlexpo/bludown.gif有用なデータの後にランダムに見える212バイトのlibreofficeを参照してください。cut.gif~へopenjdkmat2一部のSun Microsystems著作権表示(未整理)を含む949バイト(ファイルサイズのほぼ80%)が追加されているようです。

答え2

AfileStephenの答えは非常に完全で、元のファイルとa.gifファイルb.7zに再分割するための代替答えを提供しません。私がここに書いたのは、元のファイルを1つのファイルにまとめる別の方法なので、元のファイルを復元する方がはるかに簡単です。

元のファイルを復元するのが難しいのは、元のファイルが単純なテキストファイルではなく、すべてバイナリデータを含むため、ファイルごとにバイナリ形式が異なるためです。このcatユーティリティは境界マークを追加しないため、結合ファイルを元のファイルに簡単に分割できます。また、元のファイルの所有権と権限を覚えていないので、問題の一部でなくても便利です。ただし、複数のファイルを単一のファイルにマージし、単一のファイルから元のファイルを抽出するために使用できる他のプログラムがあります。

最も一般的に使用されるユーティリティはtarおよびzip/ですunzip。ファイルを結合して抽出するコマンドの例は次のとおりです。

# combining z.gif and b.7z into Afile
tar cf Afile a.gif b.7z
zip Afile a.gif b.7z

# recovering (usually called extracting) the original files
tar xf Afile
unzip Afile

zipサフィックスは通常、結合ファイル(「アーカイブファイル」と呼ばれる)の名前に追加されるため、この.zipコマンドはzip Afile a.gif b.7zという名前を生成します。また、結合ファイルにサフィックスを使用して名前を付けることもAfile.zip慣例です。必ずこうする必要はありませんが。ただ、どのファイルが「tarファイル」であるかを確認するのに役立ちます。どちらのユーティリティにも、アーカイブファイルのデータ圧縮などの他のタスクを実行する機能があります。圧縮は特定の2つのファイル(すでに圧縮されている形式)には役立ちませんが、他の種類のファイルには役立ちます。tar.tar

したがって、次に2つ以上のファイルを1つにマージするときに簡単に作成できる提案があります。これはUnix / Linuxの世界で非常に一般的な作業であり、および/tarなどのzipアーカイブユーティリティはunzipほとんど常にcat

関連情報