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


Answers:


121

仅获取压缩包清单并丢弃输出,而不是解压缩文件怎么样?

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

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

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


13
-v如果仅将输出传递到,为什么要使用/dev/null
zrajm 2013年

2
正确@zrajm。猜猜是我的肌肉记忆开始了!(-:
Rob Wells 2014年

5
-z也不需要该选项。在提取或列表模式下,它不执行任何操作。
asmeurer 2014年

1
@asmeurer回复:-zGNU tar肯定是这种情况-您知道在其他地方(BSD等)是否如此?
belacqua 2014年

2
@bobwells但是成功解压缩或列出内容文件是否暗含的数据完整性tar.gz?有任何支持信息吗?
冷冻火焰

99

您可能可以使用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(成功)值。如果tar或gzip有问题,$?将具有非零值。


3
bzip2 -t file.bz2用于bz2文件。
asmeurer 2014年

4
这不是仅使用两个命令来完成“ tar -tzf my_tar.tar.gz> / dev / null”的工作吗?
罗伯·威尔斯

它不是应该的吗?tar -t > /dev/null(注:tvs -t)?
星际探索者号

1
@IntrastellarExplorer是我的错字,尽管没有连字符也可以使用。我只是习惯了tar上的旧样式选项。unix.stackexchange.com/questions/394060/...
约翰·博克

32

如果要对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*

1
在我看来,最好的测试就是这个。它确实提取每个文件,并确保没有错误。
袖子

真的很有用。我制作了一个shell脚本,添加了一个参数挂钩以传递文件的路径并将其放在我的路径中:) [tar -xvzf $ 1 -O> / dev / null]
smonff 2012年

@sleeves为什么您认为它比公认的答案更好?tar -tvzf hello.tgz> / dev / null也给出相同的错误。
dash17291 2013年

5
@ dash17291之所以这样说,是因为我希望证明它是一个棘手的问题,以证明在所有情况下-tvf都将捕获-xvf所具有的所有错误或损坏。换句话说,-xvf将捕获所有-tvf,但是我不能说相反是正确的。

也许您也应该使用> /dev/null该示例。
moi 2016年

12

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

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

迷你基准测试:在22G归档文件上以pigz -cvd:80s运行,同时以可接受的答案tar -tzv:143s运行。
Wadih M.

使用此方法时,如何从cronjob中删除有关“ tar:从成员名称中删除开头的'/'的通知”?
MaXi32

3

我已经尝试了以下命令,它们运行良好。

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

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


2

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

这发生在BSD tar上,而不发生在GNU tar上。
mcallister

1

这些都是次优解决方案。从GZIP规范

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

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


如果文件已被截断,则似乎需要完全解压缩才能检测到
philwalk

0

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


人们很少使用没有压缩的tar文件。我想您的评论只针对未压缩的文件。
Jarekczek

6
您将诚信与腐败相混淆。您的文件已失去完整性,但仍然是可接受的存档格式。
Phil 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.