Wie kann ich überprüfen, ob eine Unix .tar.gz-Datei eine gültige Datei ist, ohne sie zu dekomprimieren?

Antworten:

121

Wie wäre es, nur eine Liste des Tarballs zu erhalten und die Ausgabe wegzuwerfen, anstatt die Datei zu dekomprimieren?

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

Bearbeitet gemäß Kommentar. Danke zrajm!

Nach Kommentar bearbeiten. Danke Frozen Flame! Dieser Test impliziert in keiner Weise die Integrität der Daten. Da es als Dienstprogramm zur Bandarchivierung konzipiert wurde, erlauben die meisten Implementierungen von tar mehrere Kopien derselben Datei!

Rob Wells
quelle
13
Warum verwenden, -vwenn Sie nur die Ausgabe an leiten /dev/null?
Zrajm
2
True @zrajm. Ich denke, es ist mein Muskelgedächtnis! (-:
Rob Wells
5
Die -zOption ist ebenfalls nicht erforderlich. Im Extraktions- oder Listenmodus wird nichts ausgeführt.
Asmeurer
1
@asmeurer Re: -zDas ist definitiv bei GNU tar der Fall - wissen Sie, ob dies anderswo wahr ist (BSD usw.)?
Belacqua
2
@bobwells Aber impliziert eine erfolgreiche Dekomprimierung oder Auflistung von Inhaltsdateien die Datenintegrität der tar.gz? Support-Informationen?
Frozen Flame
99

Sie könnten wahrscheinlich die Option gzip -t verwenden, um die Integrität der Dateien zu testen

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

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

So testen Sie die gzip-Datei ist nicht beschädigt:

gunzip -t file.tar.gz

Das Testen der darin enthaltenen TAR-Datei ist nicht beschädigt:

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

Als Teil der Sicherung könnten Sie wahrscheinlich einfach den letzteren Befehl ausführen und den Wert von $? danach für einen 0 (Erfolg) Wert. Wenn entweder der Teer oder der GZIP ein Problem hat, $? wird einen Wert ungleich Null haben.

John Boker
quelle
3
Und bzip2 -t file.bz2für bz2-Dateien.
Asmeurer
4
Verwenden Sie nicht nur zwei Befehle, um das zu tun, was "tar -tzf my_tar.tar.gz> / dev / null" tut?
Rob Wells
Soll es nicht sein tar -t > /dev/null(Anmerkung: tvs -t)?
Intrastellar Explorer
1
@IntrastellarExplorer, das ist ein Tippfehler von meiner Seite, obwohl es immer noch ohne den Bindestrich funktionieren sollte. Ich bin nur an die alten Stiloptionen für Teer gewöhnt. unix.stackexchange.com/questions/394060/…
John Boker
32

Wenn Sie einen echten Testextrakt einer TAR-Datei erstellen möchten, ohne auf die Festplatte zu extrahieren, verwenden Sie die Option -O. Dadurch wird der Extrakt anstelle des Dateisystems auf die Standardausgabe übertragen. Wenn die TAR-Datei beschädigt ist, wird der Prozess mit einem Fehler abgebrochen.

Beispiel für einen fehlgeschlagenen Teerballtest ...

$ 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.*

Arbeitsbeispiel ...

$ 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*
Ossie Moore
quelle
1
Es scheint mir, dass der beste Test dieser ist. Es extrahiert wirklich jede Datei und stellt sicher, dass keine Fehler vorliegen.
Ärmel
Sehr nützlich. Ich habe ein Shell-Skript erstellt, einen Argument-Hook hinzugefügt, um den Pfad der Datei zu übergeben und ihn in meinen Pfad einzufügen :) [tar -xvzf $ 1 -O> / dev / null]
smonff
@sleeves Warum denkst du, ist es besser als die akzeptierte Antwort? tar -tvzf hello.tgz> / dev / null gibt ebenfalls den gleichen Fehler aus.
dash17291
5
@ dash17291 Ich sage dies, weil ich erwarte, dass es ein schwieriges Problem ist, zu beweisen, dass ein -tvf in allen Fällen alle Fehler oder Beschädigungen abfängt, die ein -xvf aufweist. Mit anderen Worten, -xvf wird all das -tvf fangen, aber ich kann nicht sagen, dass das Gegenteil wahr ist.
Ärmel
Vielleicht sollten Sie auch > /dev/nullfür das Arbeitsbeispiel verwenden.
Moi
12

Sie können den Inhalt der Datei * .tag.gz auch mit pigz(parallel gzip) überprüfen, um die Archivprüfung zu beschleunigen:

pigz -cvdp number_of_threads /[...]path[...]/archive_name.tar.gz | tar -tv > /dev/null
ein
quelle
Mini-Benchmark: Ausführen mit pigz -cvd: 80s, Ausführen mit akzeptierter Antwort tar -tzv: 143s in einem 22G-Archiv.
Wadih M.
Wie entfernst du die Benachrichtigung von cronjob über "tar: Entfernen von führenden" / "aus Mitgliedsnamen", wenn du diese Methode verwendest?
MaXi32
3

Ich habe den folgenden Befehl ausprobiert und sie funktionieren gut.

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

Wir können jedoch feststellen, dass diese beiden Befehle zeitaufwändig sind. Vielleicht brauchen wir einen schnelleren Weg, um die Unversehrtheit der Komprimierungsdateien festzustellen.

Shicheng Guo
quelle
2

Eine nette Option ist die Verwendung, tar -tvvf <filePath>die eine Zeile hinzufügt, die die Art der Datei meldet.

Beispiel in einer gültigen .tar-Datei:

> 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

Beschädigte .tar-Datei:

> tar -tvvf corrupted.tar 
tar: Unrecognized archive format
Archive Format: (null),  Compression: none
tar: Error exit delayed from previous errors.
diegoreymendez
quelle
Dies tritt bei BSD-Teer auf, jedoch nicht bei GNU-Teer.
Mcallister
1

Dies sind alles sehr suboptimale Lösungen. Aus der GZIP-Spezifikation

ID2 (IDentification 2)
Diese haben die festen Werte ID1 = 31 (0x1f, \ 037), ID2 = 139 (0x8b, \ 213), um die Datei als im gzip-Format zu identifizieren.

Muss in die Sprache codiert werden, die Sie verwenden.

Kevin Liu
quelle
Wenn die Datei abgeschnitten wurde, scheint dies eine vollständige Dekomprimierung zu erfordern, um sie zu erkennen
philwalk
0

> Verwenden Sie die Option -O. [...] Wenn die TAR-Datei beschädigt ist, wird der Prozess mit einem Fehler abgebrochen.

Manchmal ja, aber manchmal nicht. Sehen wir uns ein Beispiel für eine beschädigte Datei an:

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

Es zeigt:

my_name
Fool  

Auch wenn Sie ausführen

echo $?

Teer sagte, dass es keinen Fehler gab:

0

aber die Datei wurde beschädigt, es hat jetzt "Fool" anstelle von "Pete".

Sys
quelle
Menschen verwenden Tar-Dateien selten ohne Komprimierung. Ich denke, Ihre Bemerkung betrifft nur unkomprimierte Dateien.
Jarekczek
6
Sie verwechseln Integrität mit Korruption. Ihre Datei hat ihre Integrität verloren, ist aber immer noch ein akzeptables Archivformat.
Phil