2010-01-04 92 views

回答

89

如何獲取tarball的列表並丟棄輸出,而不是解壓文件?

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

按照評論編輯。謝謝zrajm!

按照評論編輯。感謝凍火!這個測試決不意味着數據的完整性。因爲它被設計成磁帶存檔實用程序,所以大多數tar實現將允許同一文件的多個副本!

+10

如果你只是將輸出傳遞給'/ dev/null',爲什麼要使用'-v'? – zrajm 2013-12-29 13:38:39

+1

True @zrajm。猜猜這是我的肌肉記憶踢! ( - : – 2014-01-10 09:55:15

+3

'-z'選項也是不需要的,它在提取或列表模式下不執行任何操作 – asmeurer 2014-01-14 22:07:26

80

你很可能使用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

'gunzip -t file.gz':此測試可能通過,但它不會測試磁帶歸檔(tar)文件的完整性。 – 2011-10-28 06:53:58

+0

謝謝菲利普,我已將您的寶貴意見納入答案。 – spacediver 2013-02-26 20:52:12

+0

和'bzip2 -t file.bz2'爲bz2文件。 – asmeurer 2014-01-14 22:08:58

24

如果要在不提取到磁盤的情況下對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

在我看來,最好的測試就是這個。它真正提取每個文件並確保沒有錯誤。 – sleeves 2012-01-23 20:36:05

+0

真的很有用。我已經做了一個shell腳本,添加一個參數鉤子來傳遞文件的路徑,並把它放在我的路徑:) [tar -xvzf $ 1 -O>/dev/null] – smonff 2012-08-22 19:19:44

+0

@sleeves你爲什麼認爲它是比接受的答案更好? tar -tvzf hello.tgz>/dev/null也會給出同樣的錯誤。 – dash17291 2013-03-04 15:48:47

0

> use the -O option. [...] If the tar file is corrupt, the process will abort with an error.

有時候是的,但有時不是。讓我們來看看一個已損壞的文件的例子:

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 

但文件已損壞,它有n 「愚人」而不是「皮特」。

+0

人們很少使用沒有任何壓縮的tar文件。我猜你的評論只關注未壓縮的文件。 – Jarekczek 2012-11-18 12:47:22

+3

你把腐敗與誠信混爲一談。你的文件已經失去了完整性,但它仍然是一個可以接受的檔案格式。 – Phil 2015-10-19 08:34:58

9

您還可以檢查* .tag的內容。使用pigz(並行的gzip)GZ文件用來加快檔案檢查:

pigz -cvdp number_of_threads /[...]path[...]/archive_name.tar.gz | tar -tv > /dev/null 
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. 
+0

這發生在BSD焦油上,但不在GNU焦油上。 – mcallister 2014-05-20 16:48:48

3

我曾嘗試下面的命令,他們工作得很好。

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

但是,我們可以發現這兩個命令是耗時的。也許我們需要一些更快捷的方式來確定壓縮文件的完整性。

0

這些都是非常不理想的解決方案。從GZIP spec

ID2 (IDentification 2)
These have the fixed values ID1 = 31 (0x1f, \037), ID2 = 139 (0x8b, \213), to identify the file as being in gzip format.

必須編碼成您正在使用的任何語言。

相關問題