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

Réponses:

122

Qu'en est-il simplement d'obtenir une liste de l'archive tar et de 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 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!

Rob Wells
la source
13
Pourquoi l'utiliser -vsi vous ne faites que diriger la sortie /dev/null?
zrajm
2
Vrai @zrajm. Je suppose que c'est ma mémoire musculaire qui entre en jeu! (-:
Rob Wells
5
L' -zoption est également inutile. Il ne fait rien en mode extraction ou liste.
asmeurer le
1
@asmeurer Re: -zC'est certainement le cas avec GNU tar - savez-vous si c'est vrai ailleurs (BSD, etc.)?
belacqua
2
@bobwells Mais est-ce qu'une décompression ou une liste de fichiers de contenu réussie implique l'intégrité des données du tar.gz? Des informations d'assistance?
Frozen Flame
99

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

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

John Boker
la source
3
Et bzip2 -t file.bz2pour les fichiers bz2.
asmeurer le
4
N'est-ce pas simplement utiliser deux commandes pour faire ce que fait "tar -tzf my_tar.tar.gz> / dev / null"?
Rob Wells
N'est-ce pas censé être tar -t > /dev/null(note: tvs -t)?
Explorateur intrastellaire
1
@IntrastellarExplorer qui est une faute de frappe de ma part, même si cela devrait toujours fonctionner sans le trait d'union. Je suis juste habitué aux options de style ancien sur le goudron. unix.stackexchange.com/questions/394060/…
John Boker
32

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

Exemple d'échec du test de la 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*
Ossie Moore
la source
1
Il me semble que le meilleur test est celui-ci. Il extrait vraiment chaque fichier et s'assure qu'il n'y a pas d'erreurs.
manches
Vraiment utile. J'ai fait un script shell, ajouté un argument hook pour passer le chemin du fichier et le mettre dans mon chemin :) [tar -xvzf $ 1 -O> / dev / null]
smonff
@sleeves Pourquoi pensez-vous que c'est mieux que la réponse acceptée? tar -tvzf hello.tgz> / dev / null donne également la même erreur.
dash17291
5
@ dash17291 Je dis cela parce que je m'attends à ce que ce soit un problème difficile de prouver que dans tous les cas, un -tvf détectera toutes les erreurs ou corruptions qu'un -xvf. En d'autres termes, -xvf attrapera tout ce que -tvf, mais je ne peux pas dire que l'inverse est vrai.
manches
Vous devriez peut-être également l'utiliser > /dev/nullpour l'exemple de travail.
moi
12

Vous pouvez également vérifier le contenu du fichier * .tag.gz en utilisant pigz(parallèle 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
ein
la source
Mini benchmark: l'exécuter avec pigz -cvd: 80s, tout en s'exécutant avec la réponse acceptée tar -tzv: 143s sur une archive 22G.
Wadih M.
Comment supprimer la notification de cronjob à propos de "tar: Suppression de` / 'de début des noms de membres "lors de l'utilisation de cette méthode?
MaXi32
3

J'ai essayé la commande suivante et elles 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égrité des fichiers compressés.

Shicheng Guo
la source
2

Une option intéressante est d'utiliser tar -tvvf <filePath>qui ajoute une ligne qui indique 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.
diegoreymendez
la source
Cela se produit sur BSD tar mais pas sur GNU tar.
mcallister
1

Ce sont toutes des solutions très sous-optimales. À partir 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.

Kevin Liu
la source
si le fichier a été tronqué, cela semblerait nécessiter une décompression complète pour être détecté
philwalk
0

> utilisez l'option -O. [...] Si le fichier tar est corrompu, le processus s'interrompra 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 a été corrompu, il a maintenant "Fool" au lieu de "Pete".

Sys
la source
Les gens utilisent rarement les fichiers tar sans aucune compression. Je suppose que votre remarque ne concerne que les fichiers non compressés.
Jarekczek
6
Vous confondez intégrité et corruption. Votre fichier a perdu son intégrité mais c'est toujours un format d'archive acceptable.
Phil