it-swarm.com.de

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

Ich habe die Frage gefunden Wie kann ich feststellen, ob Daten eine gültige TAR-Datei ohne Datei sind? , aber ich habe mich gefragt: Gibt es eine fertige Kommandozeilenlösung?

88
understack

Wie wäre es, wenn Sie einfach eine Auflistung des Tarballs erhalten und die Ausgabe wegwerfen, anstatt die Datei zu dekomprimieren?

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

Bearbeitet als Kommentar. Danke zrajm!

Bearbeiten wie pro Kommentar. Danke gefrorene Flamme! Dieser Test impliziert keinesfalls die Integrität der Daten. Da es als Bandarchivierungsprogramm konzipiert wurde, ermöglichen die meisten Implementierungen von tar mehrere Kopien derselben Datei!

100
Rob Wells

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

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

from: http://unix.ittoolbox.com/groups/technical-functional/shellscript-l/wie-nach-test-datei-integrität-von-targz-1138880

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

gunzip -t file.tar.gz

So testen Sie die TAR-Datei nicht:

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

Als Teil der Sicherung könnten Sie wahrscheinlich nur den letzteren Befehl ausführen und Den Wert von $ überprüfen? danach für einen Wert 0 (Erfolg). Wenn entweder der tar Oder der gzip ein Problem hat, $? wird einen Wert ungleich Null haben.

86
John Boker

Wenn Sie einen echten Testextrakt einer TAR-Datei ohne Extrahieren auf die Festplatte durchführen möchten, verwenden Sie die Option -O. Dadurch wird der Extrakt anstelle des Dateisystems in die Standardausgabe ausgegeben. Wenn die TAR-Datei beschädigt ist, wird der Vorgang 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*
27
Ossie Moore

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

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

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. Möglicherweise benötigen wir einen schnelleren Weg, um die Unversehrtheit der komprimierten Dateien zu ermitteln. 

3
Shicheng Guo

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

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.
1
diegoreymendez

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 im gzip-Format zu identifizieren.

Muss in jede Sprache geschrieben werden, die Sie verwenden.

1
Kevin Liu

> Verwenden Sie die Option -O. [...] Wenn die tar-Datei beschädigt ist, bricht der Prozess mit einem Fehler ab.

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 war beschädigt, sie hat jetzt "Dummkopf" anstelle von "Pete".

0
Sys