【问题标题】:Filenames without extension, check if they are gzipped files or gzipped tar files没有扩展名的文件名,检查它们是 gzipped 文件还是 gzipped tar 文件
【发布时间】:2017-05-17 10:24:49
【问题描述】:

我有一个非常大的文件列表,一些文件是 gzip 压缩的 tar 文件,而其他文件只是压缩的 gzip 文件。不幸的是,他们都得到了扩展名 .gz。有没有一种简单的方法来检查哪些文件实际上应该具有 .tar.gz 扩展名,而无需解压和重新打包所有文件?

【问题讨论】:

  • 你问这个的方式只是一个用法,而不是一个编程问题。但是,您听说过大多数 unixoid 系统附带的file 实用程序吗?它正是这样做的,针对一组已知签名测试文件。无论如何,在你的情况下,使用 gzip 或者真的,只是寻找 gzip 标头位(这都是有据可查的,如果你只是谷歌的话)也可以完成这项工作......去研究!
  • 感谢您的评论。我现在只有非常基础的unix。我google了半个小时,没找到结果,继续一一检查文件。我已经尝试了 file-command,但它只是说所有文件都是 gzip 压缩数据。当我使用 head-command 时,我会得到不可读的标题位(例如:RS▒▒K▒▒H▒,▒▒q▒▒▒_UWu}▒▒▒▒A▒d▒kP)▒p5)。我现在只需为每个文件键入“tar -xzvf 文件名”,如果它有效,我想它是一个 tar.gz 文件,如果我收到错误,我想它是一个真正的 .gz 文件。
  • 当然,您不能像读取纯文本文件一样读取文件——它们不是!但是,只需解压缩第一个假设为 512 B(对于现代计算机来说,这真的是 nothing),然后查看说明某物是否为 .tar 文件的位,您可以解决这个问题瞬间。
  • 感谢您的评论。我又搜索了 12 分钟,发现 zcat 命令解决了我的问题。一半的文件给出可读的输出,而另一半不可读。

标签: gzip tar gunzip


【解决方案1】:

您需要解压缩每个 gzip 文件的前 512 个字节。计算该标头的 tar 校验和,并查看它是否与偏移量 148 处的标头中的校验和匹配。由于 tar 的历史实现中存在一些不一致,您需要通过两种方式进行计算。从 tar 维基百科页面查看此注释:

校验和是通过取无符号字节的总和来计算的 带有八个校验和字节的标头记录的值被视为 ascii 空格(十进制值 32)。它存储为六位八进制 带有前导零的数字,后跟 NUL,然后是空格。各种各样的 实现不遵守这种格式。为了更好的 兼容性,忽略前导和尾随空格,并取 前六位数。此外,一些历史性的 tar 实现 将字节视为有符号。实现通常计算 双向校验和,如果签名或 无符号和与包含的校验和匹配。

如果校验和匹配,那么很可能您有一个 .tar.gz 文件。如果校验和不匹配,则它不是 .tar.gz 文件。

如果解压到总共1024字节,也可能是一个空的tar文件,并且字节都是零。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    相关资源
    最近更新 更多