如何检查如果一个Unix .tar.gz文件是一个有效的文件没有解压缩?

我也find了这个链接 。 但是我想知道是否有任何现成的命令行解决scheme?

那么得到一个压缩包的列表并丢弃输出,而不是解压缩文件呢?

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

按照评论编辑。 谢谢zrajm!

按照评论编辑。 感谢冻火! 这个testing决不意味着数据的完整性。 因为它被devise成一个磁带存档实用程序,大多数tar实现将允许同一个文件的多个副本!

你可以使用gzip -t选项来testing文件的完整性

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

testinggzip文件没有损坏:

 gunzip -t file.tar.gz 

testing里面的tar文件没有损坏:

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

作为备份的一部分,你可能只需要运行后面的命令并检查$的值? 之后为0(成功)值。 如果tar或gzip有问题,$? 将具有非零值。

如果你想在不提取到磁盘的情况下对tar文件进行真正的testing提取,请使用-O选项。 这将提取到标准输出而不是文件系统。 如果tar文件损坏,则进程将会中止并出现错误。

失败的焦油球testing的例子…

 $ 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* 

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

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

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

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

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

一个不错的select是使用tar -tvvf <filePath> ,它添加一个报告文件types的行。

有效的.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. 

>使用-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 

但该文件已损坏,它现在有“傻瓜”,而不是“皮特”。

这些都是非常不理想的解决scheme。 从GZIP规范

ID2(身份证2)
这些文件具有ID1 = 31(0x1f,\ 037),ID2 = 139(0x8b,\ 213)的固定值,用于标识文件为gzip格式。

必须编码成您正在使用的任何语言。