拆分两个串联文件

拆分两个串联文件

我已经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

行 where<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返回多个,其中一个将是 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::Infoexiftool报告图像信息的常用工具,但不幸的是,它们都没有报告该信息。

通过研究可以手工完成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.gifopenjdk似乎有 949 个额外字节(几乎是文件大小的 80%!),包括一些 Sun Microsystems 版权声明(未由 清理mat2

答案2

斯蒂芬的答案非常完整,我不会提供替代答案来将您的Afile背部分成原始文件a.gifb.7z文件。我在这里写的是一种将原始文件组合成单个文件的不同方法,因此恢复原始文件要容易得多。

恢复原始文件如此困难的原因在于,原始文件不是简单的文本文件,而是都包含二进制数据,并且每个文件的二进制格式都不同。该cat实用程序不添加任何边界标记,以便轻松地将组合文件分离回其原始文件。它也不记得原始文件的所有权和权限,即使它不是您问题的一部分,这也是有用的。但是,还有其他程序可用于将不同的文件合并为单个文件,并从单个文件中提取原始文件。

最常用的实用程序是tarzip/ 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 世界中非常常见的任务,像tarzip/ 这样的归档实用程序unzip几乎总是比cat.

相关内容