web-dev-qa-db-fra.com

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

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

88
understack

Pourquoi ne pas simplement obtenir une liste de l'archive et jeter le résultat, plutôt que de décompresser le fichier?

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

Edité 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 autorisent plusieurs copies du même fichier!

100
Rob Wells

vous pourriez probablement utiliser l'option -z de gzip 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 pouvez probablement simplement exécuter la dernière commande et vérifier la valeur de $? ensuite, pour une valeur de 0 (succès). Si le fichier tar .__ ou le fichier gzip a un problème, $? aura une valeur non nulle.

86
John Boker

Si vous voulez effectuer un extrait de test d'un fichier tar sans l'extraire sur le disque, utilisez l'option -O Cela crache l'extrait sur la sortie standard au lieu du système de fichiers. Si le fichier tar est corrompu, le processus sera interrompu avec une erreur.

Exemple de test de boule de goudron ayant échoué ...

$ 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*
27
Ossie Moore

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

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

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 beaucoup de temps. Nous avons peut-être besoin d'un moyen plus rapide de déterminer l'intégrité des fichiers compressés. 

3
Shicheng Guo

Une bonne option consiste à utiliser tar -tvvf <filePath> 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.
1
diegoreymendez

Ce sont toutes des solutions très sous-optimales. De la spec 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.

1
Kevin Liu

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

Parfois oui, mais parfois non. 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".

0
Sys