如何在不解压缩的情况下检查 Unix.tar.gz 文件是否为有效文件?

我已经找到了问题 如何确定没有文件的数据是否是有效的 tar 文件?,但我想知道: 是否有现成的命令行解决方案?

228853 次浏览

您可以使用 gzip-t 选项来测试文件的完整性

Http://linux.about.com/od/commands/l/blcmdl1_gzip.htm

发信人: http://unix.ittoolbox.com/groups/technical-functional/shellscript-l/how-to-test-file-integrity-of-targz-1138880

要测试 gzip 文件是否损坏:

gunzip -t file.tar.gz

要测试内部的 tar 文件是否已损坏:

gunzip -c file.tar.gz | tar -t > /dev/null

作为备份的一部分,您可以只运行后一个命令,然后 检查 $? 后面的值是否为0(成功) 或者 gzip 有问题,$? 将有一个非零值。

如果仅仅获取 tarball 的清单并丢弃输出,而不是解压缩文件,会怎么样呢?

tar -tzf my_tar.tar.gz >/dev/null

根据评论编辑。谢谢 zrajm!

根据评论进行编辑。谢谢冰火!这个测试绝不意味着数据的完整性。因为它被设计成一个磁带归档实用程序,所以大多数 tar 实现都允许同一个文件的多个副本!

如果希望对 tar 文件进行真正的测试提取,而不需要将其提取到磁盘,那么可以使用 -O 选项。这将把提取输出到标准输出,而不是文件系统。如果 tar 文件已损坏,进程将中止并出现错误。

焦油球测试失败的例子..。

$ echo "this will not pass the test" > hello.tgz
$ tar -xvzf hello.tgz -O > /dev/null
gzip: stdin: not in gzip format
tar: Child returned status 1
tar: Error exit delayed from previous errors
$ rm hello.*

工作范例..。

$ ls hello*
ls: hello*: No such file or directory
$ echo "hello1" > hello1.txt
$ echo "hello2" > hello2.txt
$ tar -cvzf hello.tgz hello[12].txt
hello1.txt
hello2.txt
$ rm hello[12].txt
$ ls hello*
hello.tgz
$ tar -xvzf hello.tgz -O
hello1.txt
hello1
hello2.txt
hello2
$ ls hello*
hello.tgz
$ tar -xvzf hello.tgz
hello1.txt
hello2.txt
$ ls hello*
hello1.txt  hello2.txt  hello.tgz
$ rm hello*

> 使用-O 选项。[ ... ]如果 tar 文件损坏,进程将中止并出现错误。

有时是,有时不是。让我们看一个损坏文件的例子:

echo Pete > my_name
tar -cf my_data.tar my_name


# // Simulate a corruption
sed < my_data.tar 's/Pete/Fool/' > my_data_now.tar
# // "my_data_now.tar" is the corrupted file


tar -xvf my_data_now.tar -O

它表明:

my_name
Fool

即使你执行

echo $?

Tar 表示,没有任何错误:

0

但是文件损坏了,现在是“傻瓜”而不是“皮特”。

您还可以使用 pigz(并行 gzip)检查 * . tag.gz 文件的内容,以加快归档检查:

pigz -cvdp number_of_threads /[...]path[...]/archive_name.tar.gz | tar -tv > /dev/null

一个不错的选择是使用 tar -tvvf <filePath>,它添加一行来报告文件类型。

有效的. tar 文件中的示例:

> tar -tvvf filename.tar
drwxr-xr-x  0 diegoreymendez staff       0 Jul 31 12:46 ./testfolder2/
-rw-r--r--  0 diegoreymendez staff      82 Jul 31 12:46 ./testfolder2/._.DS_Store
-rw-r--r--  0 diegoreymendez staff    6148 Jul 31 12:46 ./testfolder2/.DS_Store
drwxr-xr-x  0 diegoreymendez staff       0 Jul 31 12:42 ./testfolder2/testfolder/
-rw-r--r--  0 diegoreymendez staff      82 Jul 31 12:42 ./testfolder2/testfolder/._.DS_Store
-rw-r--r--  0 diegoreymendez staff    6148 Jul 31 12:42 ./testfolder2/testfolder/.DS_Store
-rw-r--r--  0 diegoreymendez staff  325377 Jul  5 09:50 ./testfolder2/testfolder/Scala.pages
Archive Format: POSIX ustar format,  Compression: none

已损坏的. tar 文件:

> tar -tvvf corrupted.tar
tar: Unrecognized archive format
Archive Format: (null),  Compression: none
tar: Error exit delayed from previous errors.

我尝试了下面的命令,它们工作得很好。

bzip2 -t file.bz2
gunzip -t file.gz

但是,我们可以发现这两个命令非常耗时。也许我们需要更快的方法来确定压缩文件的完整性。

这些都是非常次优的解决方案。从 GZIP 规格

ID2(身份证明文件2)
它们具有固定的值 ID1 = 31(0x1f,037) ,ID2 = 139 (0x8b,213) ,以标识为 gzip 格式的文件。

不管你用的是什么语言,都必须被编码。