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?
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!
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.
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*
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
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.
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.
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.
> 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".