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

时间:2010-01-04 19:46:32

标签: gzip validation tar gunzip

我找到了问题How to determine if data is valid tar file without a file?,但我想知道:是否有现成的命令行解决方案?

8 个答案:

答案 0 :(得分:105)

如何获取tarball列表并丢弃输出,而不是解压缩文件?

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

根据评论进行编辑。谢谢zrajm!

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

答案 1 :(得分:88)

您可以使用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有问题,$?将具有非零值。

答案 2 :(得分:28)

如果要在不提取到磁盘的情况下对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*

答案 3 :(得分:11)

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

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

答案 4 :(得分:3)

我尝试了以下命令,但效果很好。

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

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

答案 5 :(得分:1)

一个不错的选择是使用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.

答案 6 :(得分:1)

这些都是非常不理想的解决方案。来自GZIP spec

  

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

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

答案 7 :(得分:0)

  

&GT;使用-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

但文件已损坏,现在它已成为“傻瓜”而不是“Pete”。