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

J’ai trouvé la question Comment déterminer si les données sont valides fichier tar sans fichier? , mais je me demandais: existe-t-il une solution en ligne de commande prête à l’emploi?

Qu’en est-il de l’obtention d’une liste de l’archive et de la sortie, plutôt que de décompresser le fichier?

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

Édité selon le commentaire. Merci zrajm!

Modifier selon le commentaire. Merci Frozen Flame! Ce test n’implique en aucun cas l’intégrité des données. Parce qu’il a été conçu comme un utilitaire d’archivage sur bande, la plupart des implémentations de tar autoriseront plusieurs copies du même fichier!

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

à partir 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 pourriez probablement exécuter la dernière commande et vérifier la valeur de $? ensuite pour une valeur de 0 (succès). Si le tar ou le gzip a un problème, $? aura une valeur non nulle.

Si vous voulez faire un véritable extrait de test d’un fichier tar sans extraire sur disque, utilisez l’option -O. Cela crache l’extrait à la sortie standard au lieu du système de fichiers. Si le fichier tar est corrompu, le processus s’interrompt avec une erreur.

Exemple d’échec du test de balle de goudron …

 $ 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 de travail …

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

Vous pouvez également vérifier le contenu du fichier * .tag.gz en utilisant pigz (parallel gzip) pour accélérer la vérification de l’archive:

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

J’ai essayé la commande suivante et ils fonctionnent bien.

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

Cependant, nous pouvons constater que ces deux commandes prennent du temps. Peut-être avons-nous besoin d’un moyen plus rapide pour déterminer l’intégralité des fichiers compressés.

Une option intéressante consiste à utiliser tar -tvvf qui ajoute une ligne indiquant le type de fichier.

Exemple dans un fichier .tar valide:

 > 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 

Fichier .tar corrompu:

 > tar -tvvf corrupted.tar tar: Unrecognized archive format Archive Format: (null), Compression: none tar: Error exit delayed from previous errors. 

> utilisez l’option -O. […] Si le fichier tar est corrompu, le processus s’interrompt 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 

Ça 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 “Fool” au lieu de “Pete”.

Ce sont toutes des solutions très sous-optimales. De la spécification GZIP

ID2 (IDentification 2)
Ceux-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.