如何在不解压缩的情况下检查 Unix .tar.gz 文件是否是有效文件?
-
18-09-2019 - |
题
我已经找到问题了 如何确定数据是否是有效的没有文件的tar文件?, ,但我想知道:有现成的命令行解决方案吗?
解决方案
什么刚开压缩包的列表,并扔掉输出,而不是解压缩文件?
tar -tzf my_tar.tar.gz >/dev/null
<强>编辑为每评论。感谢zrajm!
修改按照评论。由于冰冻火焰!:该测试绝不意味着数据的完整性。因为它被设计成一个磁带归档工具焦油的大多数实现将允许同一文件的多个副本!
其他提示
您可以使用 gzip -t 选项来测试文件的完整性
http://linux.about.com/od/commands/l/blcmdl1_gzip.htm
测试 gzip 文件是否损坏:
gunzip -t file.tar.gz
测试里面的tar文件没有损坏:
gunzip -c file.tar.gz | tar t > /dev/null
作为备份的一部分,您可能只能运行后一个命令并检查$的值?之后为 0(成功)值。如果焦油或GZIP有问题,$?将具有非零值。
如果你想要做一个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*
您还可以使用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
然而,我们可以发现这两个命令是耗时的。也许我们需要一些更快速的方法来确定完整的压缩文件。
一个好的选择是使用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.
这些都是非常次优的解决方案。从 GZIP符合规范
ID2(识别2),点击 这些具有固定值ID1 = 31(0x1F的,\ 037),ID2 = 139 (0x8b,\ 213),以确定该文件作为gzip格式之中。
必须是编码为你使用任何语言。
>使用-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 $?
焦油表示,没有错误:
0
但文件被损坏,它现在已“傻瓜”而不是“皮特”。