147 Stimmen

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

Ich habe die Frage gefunden Wie lässt sich feststellen, ob die Daten in einer tar-Datei gültig sind, ohne dass eine Datei vorhanden ist? aber ich habe mich gefragt: Gibt es eine fertige Kommandozeilenlösung?

166voto

Rob Wells Punkte 35303

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

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

Bearbeitet nach Kommentar. Danke zrajm!

Bearbeiten nach Kommentar. Danke Frozen Flame! Dieser Test impliziert in keiner Weise die Integrität der Daten. Da es als Bandarchivierungsprogramm entwickelt wurde, erlauben die meisten Implementierungen von tar mehrere Kopien derselben Datei!

128voto

John Boker Punkte 80493

Sie können wahrscheinlich die Option gzip -t verwenden, um die Integrität der Dateien zu prüfen

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

Um zu prüfen, ob die gzip-Datei nicht beschädigt ist:

gunzip -t file.tar.gz

Um zu prüfen, ob die tar-Datei nicht beschädigt ist:

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

Als Teil des Backups können Sie wahrscheinlich nur den letztgenannten Befehl ausführen und anschließend den Wert von $? auf 0 (Erfolg) überprüfen. Wenn entweder das tar oder gzip ein Problem hat, wird $? einen Wert ungleich Null haben.

40voto

Ossie Moore Punkte 371

Wenn Sie einen echten Test-Extrakt einer tar-Datei durchführen wollen, ohne auf die Festplatte zu extrahieren, verwenden Sie die Option -O. Damit wird das Extrakt auf die Standardausgabe statt auf das Dateisystem ausgegeben. Wenn die tar-Datei beschädigt ist, bricht der Prozess mit einer Fehlermeldung ab.

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*

12voto

ein Punkte 121

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

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

6voto

diegoreymendez Punkte 1877

Eine gute Möglichkeit ist die Verwendung von tar -tvvf <filePath> die eine Zeile hinzufügt, in der die Art der Datei angegeben wird.

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X