web-dev-qa-db-ja.com

Unix .tar.gzファイルが圧縮解除せずに有効なファイルであるかどうかを確認する方法

私は質問を見つけました データがファイルなしの有効なtarファイルであるかどうかを判断する方法? 、しかし、私は疑問に思っていました:既製のコマンドラインソリューションはありますか?

94
understack

ファイルを解凍するのではなく、tarballのリストを取得して出力を破棄するだけではどうでしょうか。

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

コメントごとに編集。ありがとうzrajm!

コメントに従って編集。ありがとう、Frozen Flame!このテストは、データの整合性を意味するものではありません。テープアーカイブユーティリティとして設計されているため、tarのほとんどの実装では、同じファイルの複数のコピーが許可されます。

107
Rob Wells

おそらくgzip -tオプションを使用してファイルの整合性をテストできます。

http://linux.about.com/od/commands/l/blcmdl1_gzip.htm

from: http://unix.ittoolbox.com/groups/technical-functional/shellscript-l/how-to-test-file-integrity-of-targz-113888

Gzipファイルが破損していないことをテストするには:

gunzip -t file.tar.gz

内部のtarファイルが破損していないことをテストするには:

gunzip -c file.tar.gz | tar t > /dev/null

バックアップの一部として、おそらく後者のコマンドを実行し、$?の値を確認できます。その後、0(成功)の値。 tarまたはgzipに問題がある場合、$?ゼロ以外の値になります。

90
John Boker

ディスクに抽出せずに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*
29
Ossie Moore

pigz(パラレルgzip)を使用して* .tag.gzファイルの内容をチェックして、アーカイブチェックを高速化することもできます。

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

次のコマンドを試してみましたが、うまく機能します。

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

ただし、これら2つのコマンドは時間がかかることがわかります。おそらく、圧縮ファイルの完全性を判断するためのより迅速な方法が必要です。

3
Shicheng Guo

素敵なオプションは、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.
1
diegoreymendez

これらはすべて非常に次善のソリューションです。 GZIP仕様 から

ID2(識別2)

使用している言語にコーディングする必要があります。

1
Kevin Liu

> -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」ではなく「Fool」になりました。

0
Sys