Unixの.tar.gzファイルが解凍せずに有効なファイルかどうかを確認するにはどうすればよいですか?


回答:


121

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

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

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

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


13
-v出力をパイプするだけの場合はなぜ使用するの/dev/nullですか?
zrajm 2013

2
真の@zrajm。それは私の筋肉の記憶だと思います!(-:
ロブウェルズ2014年

5
-zオプションも不要です。抽出モードまたはリストモードでは何も行いません。
asmeurer 2014年

1
@asmeurer Re:-zそれは間違いなくGNU tarの場合です-これが他の場所(BSDなど)でこれに当てはまるかどうか知っていますか?
belacqua 2014年

2
@bobwellsしかし、正常な解凍またはコンテンツファイルのリストは、データの整合性を意味しますtar.gzか?サポート情報はありますか?
Frozen Flame

99

おそらく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のいずれかに問題がある場合、$?ゼロ以外の値になります。


3
そしてbzip2 -t file.bz2bz2ファイルのために。
asmeurer 2014年

4
これは、「tar -tzf my_tar.tar.gz> / dev / null」の機能を実行するために2つのコマンドを使用するだけではありませんか?
ロブ・ウェルズ

tar -t > /dev/null(注:tvs -t)はずではありませんか?
恒星内探検家

1
@IntrastellarExplorerは私のタイプミスですが、ハイフンがなくても機能するはずです。tarの古いスタイルオプションに慣れているだけです。unix.stackexchange.com/questions/394060/...
ジョンボーカー

32

ディスクに抽出せずに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
最高のテストはこれだと思います。本当に各ファイルを抽出し、エラーがないことを確認します。
スリーブ

本当に便利です。シェルスクリプトを作成し、ファイルのパスを渡す引数フックを追加してパスに入れました:) [tar -xvzf $ 1 -O> / dev / null]
smonff

@sleeves受け入れられた回答よりも優れていると思うのはなぜですか。tar -tvzf hello.tgz> / dev / nullでも同じエラーが発生します。
dash17291 2013年

5
@ dash17291私がこれを言うのは、すべてのケースで-tvfが-xvfのすべてのエラーまたは破損をキャッチすることを証明するのは難しい問題であるためです。つまり、-xvfはそのすべての-tvfをキャッチしますが、その逆は当てはまりません。
スリーブ

たぶん、あなた> /dev/nullも実際の例に使うべきです。
moi

12

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

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

ミニベンチマーク:pigz -cvd:80sで実行し、22Gアーカイブで受け入れられた回答tar -tzv:143sで実行します。
Wadih M.18年

この方法を使用する場合、cronジョブから「tar:メンバー名から先頭の「/」を削除する」という通知を削除するにはどうすればよいですか。
MaXi32

3

私は次のコマンドを試してみましたが、うまくいきます。

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

ただし、これら2つのコマンドは時間がかかることがわかります。多分私達は圧縮ファイルの完全な状態を決定するためのもう少し迅速な方法が必要です。


2

良いオプションは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.

これは、BSD tarでは発生しますが、GNU tarでは発生しません。
mcallister 2014年

1

これらはすべて非常に最適ではないソリューションです。GZIP仕様から

ID2(IDentification 2)
これらは固定値ID1 = 31(0x1f、\ 037)、ID2 = 139(0x8b、\ 213)を持ち、ファイルがgzip形式であることを識別します。

使用している言語にコード化する必要があります。


ファイルが切り詰められている場合、検出するには完全な解凍が必要と思われます
philwalk

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 $?

タールはエラーがなかったと言った:

0

しかし、ファイルは破損しており、「ピート」ではなく「フール」になっています。


圧縮なしでtarファイルを使用することはほとんどありません。あなたの発言は非圧縮ファイルのみに関係していると思います。
Jarekczek

6
誠実さと腐敗を混同しています。ファイルの整合性が失われましたが、まだ許容できるアーカイブ形式です。
Phil
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.