Rob*_*lls 112

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

tar -tzf my_tar.tar.gz >/dev/null
Run Code Online (Sandbox Code Playgroud)

根据评论编辑.谢谢zrajm!

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

  • 如果你只是将输出传递给`/ dev/null`,为什么要使用`-v`? (13认同)
  • `-z`选项也是不需要的.它在提取或列表模式下不执行任何操作. (5认同)
  • 正确@zrajm。猜猜是我的肌肉记忆开始了!(-: (2认同)
  • @belacqua 对于其他人的信息,如 BSD TAR 的联机帮助页中所示,`-z`:“...在提取或列表模式下,此选项被忽略。” (2认同)
  • @bobwells但是成功解压缩或列出内容文件是否意味着tar.gz的数据完整性?有任何支持信息吗? (2认同)

Joh*_*ker 92

您可以使用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
Run Code Online (Sandbox Code Playgroud)

测试里面的tar文件没有损坏:

gunzip -c file.tar.gz | tar t > /dev/null
Run Code Online (Sandbox Code Playgroud)

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

  • 这不是仅使用两个命令来完成“ tar -tzf my_tar.tar.gz> / dev / null”的工作吗? (3认同)
  • 以及bz2文件的`bzip2 -t file.bz2`。 (2认同)

小智 30

如果要在不提取到磁盘的情况下对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.*
Run Code Online (Sandbox Code Playgroud)

工作实例......

$ 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*
Run Code Online (Sandbox Code Playgroud)

  • @ dash17291我这样说是因为我认为这是一个难以证明的问题,对于所有情况,-tvf将捕获-xvf的所有错误或损坏.换句话说,-xvf将捕获所有-tvf,但我不能说反过来是真的. (4认同)
  • 在我看来,最好的测试就是这个。它真正提取每个文件并确保没有错误。 (2认同)

小智 11

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

pigz -cvdp number_of_threads /[...]path[...]/archive_name.tar.gz | tar -tv > /dev/null
Run Code Online (Sandbox Code Playgroud)


die*_*dez 5

一个不错的选择是使用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
Run Code Online (Sandbox Code Playgroud)

损坏的 .tar 文件:

> tar -tvvf corrupted.tar 
tar: Unrecognized archive format
Archive Format: (null),  Compression: none
tar: Error exit delayed from previous errors.
Run Code Online (Sandbox Code Playgroud)