Page 1 sur 1
[scripting bash] Tester une archive 7-zip
Publié : dim. 09 nov. 2014, 11:42
par NY152
Bonjour,
J'aimerais créer un script bash permettant de tester des archives 7zip mais j'aimerais que ce script déplace les archives corrompues rencontrées (en créant un dossier corrompus dans le dossier testé par exemple)
Comme je suis pas très doué dans le scripting bash, j'en appelle à vos lumières pour m'aider. je me débrouillerais pour adapter ce qui me sera donné pour gérer les autres formats d'archives.
Je vous remercie par avance

Re: Tester une archive 7-zip
Publié : dim. 09 nov. 2014, 11:56
par FoolEcho
Re: [scripting bash] Tester une archive 7-zip
Publié : dim. 09 nov. 2014, 12:30
par FoolEcho
Pour ton problème, la base du test devrait consister à évaluer le code de retour de 7z (qui s'obtient en bash avec $? et sachant que le man de 7z n'est pas clair sur l'aspect corrompu donc a priori se contenter du «y a eu un problème, on place l'archive ailleurs»), un truc du genre: (non testé)
Code : Tout sélectionner
#Pour chaque archive à tester
#faire
7z t "$i"
#si le test rencontre un problème quelconque
if test $? -ne 0
then
#on isole l'archive
mv $i $rep
fi
avec i désignant une archive à tester... à voir comment tu tiens à ce que ton script récupère les archives (fichiers/répertoires...)
et $rep... un répertoire qui sera créé au besoin, en amont ou pas (... là encore, c'est selon l'entrée, mais tout ça se gère bien à coup de
realpath
,
dirname
et cie par exemple...)
Re: [scripting bash] Tester une archive 7-zip
Publié : dim. 09 nov. 2014, 12:54
par NY152
J'ai pas encore essayé mais on m'a passé ce bout de code à l'instant.
Code : Tout sélectionner
ext="7z"
search_folder="$1"
bad_folder="${search_folder}/corrompus"
[[ ! -d "${bad_folder}" ]] && mkdir -p "${bad_folder}"
while read fichier
do
fichier="${fichier%%.${ext}*}"
fichier="${fichier/#.\/}"
echo "Deplacement du fichier ${fichier}.${ext} vers ${bad_folder}"
#mv "${fichier}.${ext}" "${bad_folder}"
done < <(find "${search_folder}" -name "*.${ext}" -print0 | xargs -0 7z t | egrep "Error:")
Est-ce un code fonctionnel ?
Je suis obligé de terminer une tâche sous Windows avant de pouvoir tester :/
Re: [scripting bash] Tester une archive 7-zip
Publié : dim. 09 nov. 2014, 13:34
par FoolEcho
Fonctionnel probablement, mais plus que sujet à caution:
- la limitation aux extensions n'a que peu de valeurs sous Linux (ton archive pourrait aussi bien se terminer par .truc ou ne rien avoir qu'elle pourrait tout de même être une archive analysable par 7z ou autre, tu n'as qu'à faire le test: son code considérera l'archive comme mauvaise là où mon bout de code la validera bel et bien)
- rechercher dans la sortie de
7z t
s'il y a le mot "Error" alors que le code de retour est de très loin l'information la plus valable est une horreur (il se passe quoi si 7z est localisé ou change la présentation de sa sortie ? ... alors que le code de retour est fait pour ça...).
De mauvaises pratiques, donc...

Re: [scripting bash] Tester une archive 7-zip
Publié : dim. 09 nov. 2014, 14:55
par NY152
Ton code indiquerait comme corrompu un fichier qui ne serait pas une archive aussi non ? Admettons qu'une image serait dans le répertoire, il retournerait une erreur et déplacerait un fichier qui ne doit pas l'être non ?
Re: [scripting bash] Tester une archive 7-zip
Publié : dim. 09 nov. 2014, 16:02
par FoolEcho
NY152 a écrit :Ton code indiquerait comme corrompu un fichier qui ne serait pas une archive aussi non ? Admettons qu'une image serait dans le répertoire, il retournerait une erreur et déplacerait un fichier qui ne doit pas l'être non ?
Non car mon pseudo-code est blindé avec un prérequis: ^^
FoolEcho a écrit :#Pour chaque archive à tester
#faire
Je pose donc comme préalable que ma routine n'est appelée qu'avec une archive.
Mais dans les faits, il serait fait à la volée en vérifiant d'abord le mime-type du fichier (des éléments indiqués par la sortie de
file -i
en l'occurrence.) et non l'extension.

Je ne connais pas (ça ne veut pas dire que ça n'existe pas) d'autres moyens que de passer par quelques fonctions supplémentaires (quelque chose basé sur ce goût-là en modifiant le tableau VALID_MIMETYPES, avec application/x-gzip, etc.:
https://gist.github.com/larvanitis/4088616 )...
Ça donnerait donc:
Code : Tout sélectionner
#Pour chaque archive à tester
#faire
if containsElement "$FILE_MIME" "${VALID_MIMETYPES[@]}"
then
7z t "$i"
#si le test rencontre un problème quelconque
if test $? -ne 0
then
#on isole l'archive
mv $i $rep
fi
fi
C'est juste un squelette, hein...
Autrement, pour les archives (ou tout autre fichier d'ailleurs), il y a une méthode 1000 fois plus simple pour vérifier s'il est corrompu: les sommes de contrôle (bon, à condition que l'archive de départ ne soit elle-même pas corrompu, mais là encore faut bien partir d'un pré-requis...

).
Re: [scripting bash] Tester une archive 7-zip
Publié : dim. 09 nov. 2014, 18:01
par NY152
Ce niveau de filtrage de fichiers dépasse mes faibles compétences, voilà pourquoi je cherchais la simplicité

Re: [scripting bash] Tester une archive 7-zip
Publié : dim. 09 nov. 2014, 18:28
par FoolEcho
C'est simple puisque tu as justement le bout de code pour le faire, il suffit de compléter le tableau (un
file
sur les différentes archives te donnera l'information dont tu as besoin et tu pourras toujours compléter s'il en manque).
