[scripting bash] Tester une archive 7-zip

Applications, problèmes de configuration réseau
NY152
archer
Messages : 109
Inscription : sam. 28 sept. 2013, 00:35

[scripting bash] Tester une archive 7-zip

Message 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 :)
Dernière modification par NY152 le dim. 09 nov. 2014, 12:07, modifié 1 fois.
Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10711
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: Tester une archive 7-zip

Message par FoolEcho »

Salut,

Merci de rectifier le titre. https://wiki.archlinux.fr/Forum#Format_du_titre :chinois:
«The following statement is not true. The previous statement is true.» :nage:
Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10711
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [scripting bash] Tester une archive 7-zip

Message 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...)
«The following statement is not true. The previous statement is true.» :nage:
NY152
archer
Messages : 109
Inscription : sam. 28 sept. 2013, 00:35

Re: [scripting bash] Tester une archive 7-zip

Message 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 :/
Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10711
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [scripting bash] Tester une archive 7-zip

Message 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... :|
«The following statement is not true. The previous statement is true.» :nage:
NY152
archer
Messages : 109
Inscription : sam. 28 sept. 2013, 00:35

Re: [scripting bash] Tester une archive 7-zip

Message 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 ?
Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10711
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [scripting bash] Tester une archive 7-zip

Message 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. :chinois:
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... :| ).
«The following statement is not true. The previous statement is true.» :nage:
NY152
archer
Messages : 109
Inscription : sam. 28 sept. 2013, 00:35

Re: [scripting bash] Tester une archive 7-zip

Message par NY152 »

Ce niveau de filtrage de fichiers dépasse mes faibles compétences, voilà pourquoi je cherchais la simplicité :)
Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10711
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [scripting bash] Tester une archive 7-zip

Message 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). :P
«The following statement is not true. The previous statement is true.» :nage:
Répondre