Comment vérifier si un Unix.tar.gz fichier est un fichier valide sans décompression?

j'ai trouvé la question Comment déterminer si les données sont un fichier tar valide sans un fichier? , mais je me demandais: existe-t-il une solution en ligne de commande?

82
demandé sur Benjamin W. 2010-01-04 22:46:32

8 réponses

pourquoi ne pas simplement obtenir une liste de l'archive et jeter la sortie, plutôt que de décompresser le fichier?

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

modifié selon le commentaire. Merci zrajm!

modifier comme dans le commentaire. Merci La Flamme Gelée! ce test n'implique en rien l'intégrité des données. Parce qu'il a été conçu comme une utilité d'archivage de bande la plupart des implémentations de tar permettra de multiples copies de la même fichier!

96
répondu Rob Wells 2015-07-23 15:58:46

vous pouvez probablement utiliser l'option gzip-t pour tester l'intégrité des fichiers ""

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

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

Pour tester le fichier gzip n'est pas corrompu:

gunzip -t file.tar.gz

Pour tester le fichier tar à l'intérieur n'est pas corrompu:

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

dans le cadre de la sauvegarde, vous pouvez probablement juste exécuter la dernière commande et vérifier la valeur de $? ensuite pour une valeur 0 (succès). Si le goudron ou le gzip a un problème, $? aura pas égal à zéro.

82
répondu John Boker 2012-07-31 01:38:22

si vous voulez faire un vrai extrait de test d'un fichier tar sans l'extraire sur disque, utilisez l'option-O. Ceci envoie l'extrait à la sortie standard au lieu du système de fichiers. Si le fichier tar est corrompu, le processus avortera avec une erreur.

exemple d'essai à la bille de goudron raté...

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

Exemple Pratique...

$ 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*
26
répondu Ossie Moore 2015-01-31 23:33:54

Vous pouvez également vérifier le contenu de *.balise.gz fichier à l'aide de pigz (parallèle gzip) à l'accélération de l'archive case:

pigz -cvdp number_of_threads /[...]path[...]/archive_name.tar.gz | tar -tv > /dev/null
10
répondu ein 2015-08-20 19:10:25

j'ai essayé le commandement suivant et ils fonctionnent bien.

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

Cependant, nous pouvons trouver que ces deux commandes prennent beaucoup de temps. Peut-être qu'on a besoin d'un moyen plus rapide pour déterminer l'intégrité des fichiers compressés.

3
répondu Shicheng Guo 2016-02-18 21:32:31

Une option intéressante est d'utiliser tar -tvvf <filePath> qui ajoute une ligne indiquant le type de fichier.

exemple dans un valide .dossier tar:

> 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

corrompu .dossier tar:

> tar -tvvf corrupted.tar 
tar: Unrecognized archive format
Archive Format: (null),  Compression: none
tar: Error exit delayed from previous errors.
1
répondu diegoreymendez 2013-08-01 17:29:05

> utilisez l'option-O. [...] Si le fichier tar est corrompu, le processus avortera avec une erreur.

Parfois oui, mais parfois pas. Voyons un exemple de fichier corrompu:

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

il montre:

my_name
Fool  

même si vous exécutez

echo $?

tar a dit qu'il n'y avait pas d'erreur:

0

mais le fichier était corrompu, il a maintenant "idiot" au lieu de "Pete".

0
répondu Sys 2015-01-31 23:33:26

ce sont tous des solutions très sous-optimales. De la gzip spec

ID2 (IDentification 2)

Celles-ci ont les valeurs fixes ID1 = 31 (0x1f, \037), ID2 = 139 (0x8b, \213), pour identifier le fichier comme étant au format gzip.

doit être codé dans la langue que vous utilisez.

0
répondu Kevin Liu 2017-05-12 23:35:42