Ich habe die Frage gefunden, wie festgestellt werden kann, ob Daten eine gültige TAR-Datei ohne Datei sind. , aber ich habe mich gefragt: Gibt es eine fertige Kommandozeilenlösung?
Ich habe die Frage gefunden, wie festgestellt werden kann, ob Daten eine gültige TAR-Datei ohne Datei sind. , aber ich habe mich gefragt: Gibt es eine fertige Kommandozeilenlösung?
Antworten:
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!
-z
Option ist ebenfalls nicht erforderlich. Im Extraktions- oder Listenmodus wird nichts ausgeführt.
-z
Das ist definitiv bei GNU tar der Fall - wissen Sie, ob dies anderswo wahr ist (BSD usw.)?
tar.gz
? Support-Informationen?
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
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.
bzip2 -t file.bz2
für bz2-Dateien.
tar -t > /dev/null
(Anmerkung: t
vs -t
)?
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*
> /dev/null
für das Arbeitsbeispiel verwenden.
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
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.
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.
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.
> 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".
-v
wenn Sie nur die Ausgabe an leiten/dev/null
?