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?
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!
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
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.
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*
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
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.
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.
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.
> 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".