128

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

4

8 回答 8

143

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

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

根据评论编辑。谢谢zrajm!

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

于 2010-01-04T19:51:30.447 回答
110

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

于 2010-01-04T19:51:13.583 回答
36

如果您想在不解压到磁盘的情况下对 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*
于 2012-01-17T19:41:01.153 回答
12

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

pigz -cvdp number_of_threads /[...]path[...]/archive_name.tar.gz | tar -tv > /dev/null
于 2012-12-09T13:09:19.123 回答
3

一个不错的选择是使用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.
于 2013-08-01T17:29:05.640 回答
3

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

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

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

于 2016-02-18T21:32:31.843 回答
1

这些都是非常次优的解决方案。来自GZIP 规范

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

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

于 2017-05-12T23:18:25.133 回答
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

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

于 2012-10-16T15:58:44.980 回答