我已经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
行 where<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
返回多个,其中一个将是 7z 文件的开头,而其他文件将只是恰好包含 0x37 0x7a(ASCII 集中的7
和字符的值)字节序列的 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
、perlImage::Info
和exiftool
报告图像信息的常用工具,但不幸的是,它们都没有报告该信息。
通过研究可以手工完成GIF图像格式规范,另一种方法可能是连接到图像查看器或转换器,以查看它们在尝试解析文件时停止读取文件的位置。
我发现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 在数据结束后还没有额外的信息,这看起来并不罕见。例如,参见 libreoffice,gallery/htmlexpo/bludown.gif
它在有用数据末尾后有 212 个看似随机的字节。在cut.gif
openjdk
似乎有 949 个额外字节(几乎是文件大小的 80%!),包括一些 Sun Microsystems 版权声明(未由 清理mat2
)
答案2
斯蒂芬的答案非常完整,我不会提供替代答案来将您的Afile
背部分成原始文件a.gif
和b.7z
文件。我在这里写的是一种将原始文件组合成单个文件的不同方法,因此恢复原始文件要容易得多。
恢复原始文件如此困难的原因在于,原始文件不是简单的文本文件,而是都包含二进制数据,并且每个文件的二进制格式都不同。该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
是为组合文件指定一个带有后缀的名称.tar
,尽管您不必这样做。它只是帮助您查看哪些文件是“tar 文件”。这两个实用程序都具有执行其他操作的功能,例如压缩存档文件中的数据。压缩对您的特定两个文件没有帮助(它们已经是压缩格式),但它对其他类型的文件很有用。
因此,这是一个建议,可以让您下次想要将两个或多个文件合并为一个文件时更轻松。这是 Unix/Linux 世界中非常常见的任务,像tar
和zip
/ 这样的归档实用程序unzip
几乎总是比cat
.