
私はAfile
同等の仕事をしましたcat a.gif b.7z > Afile
。
Afile
元のファイルa.gif
とb.7z
ファイルに分割する方法は?
答え1
gifが終わり、7zが始まる場所を特定する必要があります。
gifファイルの元のサイズがわからない場合は、7z
文字で始まるファイルの先頭を参照できます7z
。
運が良ければ:
grep -boa 7z Afile
(GNUがgrep
非標準-b
(b
yteオフセット)を実装または準拠していると仮定すると、-o
(o
一致する部分のみ出力)-a
(a
テキスト以外のファイルを含むすべてのファイル))、次のいずれかが返されます。
<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.7z
head -c 1234 > a.gif
複数が返されると、grep
そのうちの1つは7zファイルの先頭になり、残りは7
0x37 0x7a(ASCIIセット合計文字値)バイトシーケンスを含むgifまたは7zファイルになります。z
どちらが正しいかを確認するには、正しい出力に似たものを返す必要があるtail -c
各出力をパイプできます。または内容をリストしてみてください。file -
7-zip archive data
bsdtar 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::Info
、exiftool
それらのどれもその情報を報告していません。
研究を通じて手動で実行可能GIF画像フォーマット仕様もう1つのアプローチは、画像ビューアまたはコンバータに接続して、ファイルの解析中にファイルの読み取りが停止する場所を確認することです。
giftopnm
私はすぐにそれを行うことができる古代のnetpbm
ソフトウェアを見つけました。 zshから:
zmodload zsh/system
{
giftopnm > /dev/null
head -c $(( systell(0) )) < Afile > a.gif
cat > b.7z
} < Afile
私のテストでは、giftopnm
pnmに変換した後、gifファイルの末尾の位置がstdinに残ります(ここでは削除します)。
データ終了後にgifに追加情報がないと仮定すると、これは奇妙には見えません。たとえば、gallery/htmlexpo/bludown.gif
有用なデータの後にランダムに見える212バイトのlibreofficeを参照してください。cut.gif
~へopenjdk
mat2
一部のSun Microsystems著作権表示(未整理)を含む949バイト(ファイルサイズのほぼ80%)が追加されているようです。
答え2
Afile
Stephenの答えは非常に完全で、元のファイルと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
。