Et bien, il n'y a rien d'extraordinaire dans mes modifications ; j'ajoute simplement la possibilité d'appeler le script comme un programme traditionnel en prenant en charge éventuellement le chemin d'un dossier différent. J'ai donc adapté ton script pour mes besoins sur un serveur tournant en ArchLinux.
Version UBUNTU
#!/bin/bash
### Variables ###
VERSION="v0.05.$(uname -n)"
# Couleurs du texte affiché dans le shell
FUSHIA="\033[1;35m"
NOIR="\033[1;0m"
BLEU="\033[1;34m"
VERT="\033[1;32m"
ROUGE="\033[1;31m"
# Liste des encodages les plus courants
CODES_LIST="iso-8859-2 iso-8859-3 iso-8859-4 iso-8859-5 iso-8859-6 iso-8859-7 iso-8859-8 iso-8859-9 iso-8859-10 iso-8859-11 iso-8859-13 iso-8859-14 iso-8859-15 iso-8859-16 cp437 cp737 cp775 cp850 cp852 cp855 cp856 cp857 cp860 cp861 cp862 cp863 cp864 cp865 cp866 cp869 cp874 cp932 cp936 cp949 cp950 cp1250 cp1251 cp1252 cp1253 cp1254 cp1255 cp1256 cp1257 cp1258 iso-8859-1"
### Introduction ###
echo -e "
----------------------------------------------------------
${BLEU}Ce script permet de lancer en boucle l'utilitaire convmv qui
permet de convertir les noms de fichiers codés en autre chose
que UTF-8 vers UTF-8. Relancer le script avec l'argument
ALLCODES si jamais aucun résultat n'a été trouvé.
Ex:
sh convmv-to-utf-8.sh /opt/ ALLCODES
${FUSHIA}V${NOIR}ersion ${VERSION}${NOIR}
----------------------------------------------------------"
# Détermination du répertoire à analyser
if [[ "${1}" == "" ]]
then
# On détermine le répertoire courant
echo -e " ${ROUGE}V${NOIR}ous êtes sur le point d'analyser ce répertoire : \n -->${ROUGE} $(pwd)${NOIR}"
else
# On contrôle si le répertoire demandé existe
if [ -d ${1} ]
then
# On se place dans le répertoire
cd ${1}
echo -e " ${ROUGE}V${NOIR}ous êtes sur le point d'analyser ce répertoire : \n -->${ROUGE} $(pwd)${NOIR}"
else
# Le répertoire n'existe pas, on arrête le script
echo -e " ${ROUGE}L${NOIR}e répertoire que vous avez demandé à analyser n'existe pas."
exit
fi
fi
# Vérification de l'existence de convmv
if [[ -z $(dpkg -l | egrep "^ii convmv") ]]
then
# Propose l'installation direct du logiciel
echo -e " ${ROUGE}L${NOIR}e logiciel convmv n'est pas installé et il est nécessaire au bon fonctionnement de ce script, voulez-vous l'installer ? [${ROUGE}O${NOIR}]ui [${ROUGE}N${NOIR}]on"
read -p " --> " confirmation_installation
# Vérifier le choix de l'installation du logiciel
if [[ ${confirmation_installation} == [OoYy]* ]]
then
sudo apt-get -y --force-yes install convmv
echo "----------------------------------------------------------"
else
echo -e " ${ROUGE}V${NOIR}ous n'avez pas souhaité d'installer automatiquement 'convmv'. Ce logiciel est nécessaire au bon fonctionnement du script."
exit
fi
fi
# Pour boucler sur tous les codepages supportés par convmv, il faut mettre ALLCODES en argument
if [[ "${2}" = "ALLCODES" ]]
then
# Affecte tous les codages connus de convmv à la variable CODES_LIST
CODES_LIST=$(convmv --list | tr '\n' ' ')
echo -e "(${ROUGE}L${NOIR}a liste complète des encodages disponibles dans convmv va être utilisée) : \n -->${ROUGE} ${CODES_LIST}"
else
echo -e "(${ROUGE}L${NOIR}a liste simplifiée des encodages disponibles va être utilisée) : \n -->${ROUGE} ${CODES_LIST}"
fi
# Demande de l'utilisation d'une analyse récursive
echo -e "
${ROUGE}V${NOIR}oulez-vous aussi analyser les sous-répertoires ? [${ROUGE}O${NOIR}]ui [${ROUGE}N${NOIR}]on [${ROUGE}A${NOIR}]rrêter :"
read -p " --> " RECURSIVITE
if [[ ${RECURSIVITE} == [Aa]* ]]
then
echo -e "\n ${ROUGE}A${NOIR}rrêt demandé.${NOIR}"
exit
elif [[ ${RECURSIVITE} == [Oo]* ]]
then
echo -e " \n -->${ROUGE} Les sous-répertoires seront analysés."
OPTION_R="-r"
fi
### Boucle principale ###
for CODAGE in ${CODES_LIST}
do
echo -e "\n${BLEU}Hypothèse du codage : ${FUSHIA}${CODAGE}${NOIR}"
# Recherche des fichiers n’étant pas en UTF-8
LISTE_FICHIER=$(convmv -f ${CODAGE} -t utf-8 ${OPTION_R} * 2>&1 | egrep "^mv ")
# Vérifie qu'il y ait bien des fichiers à renommer
if [[ -z ${LISTE_FICHIER} ]]
then
echo -e "\n${ROUGE}Aucune erreur detectée dans les caractères utilisés dans le nom des fichiers.${NOIR}\n"
exit
else
# Nombre de fichier à renommer
NOMBRE_FICHIERS=$(echo "${LISTE_FICHIER}" | wc -l)
echo -e "\n${FUSHIA}${NOMBRE_FICHIERS}${NOIR} fichiers à convertir."
fi
for ((i=1; i<=${NOMBRE_FICHIERS}; i++))
do
LIGNE=$(sed -n ${i}p <<< "${LISTE_FICHIER}")
# Récupération du nom corrompu
ANCIEN_NOM=$(cut -f2 -d '"' <<< "${LIGNE}")
# Récupération du nom corrigé
NOUVEAU_NOM=$(cut -f4 -d '"' <<< "${LIGNE}")
echo -n -e "\n${VERT}Conversion de ${NOIR}"
for (( x=0 ; x <= ${#ANCIEN_NOM} ; x++ ))
do
LETTRE_ORIGINALE=${ANCIEN_NOM:${x}:1}
LETTRE_CORRIGEE=${NOUVEAU_NOM:${x}:1}
# Comparaison des caractères entre eux
if [[ "${LETTRE_ORIGINALE}" == "${LETTRE_CORRIGEE}" ]]
then
echo -n -e "${LETTRE_ORIGINALE}"
else
echo -n -e "${BLEU}${LETTRE_ORIGINALE}${NOIR}"
fi
done
echo -n -e "${VERT} en ${NOIR}"
for (( x=0 ; x <= ${#ANCIEN_NOM} ; x++ ))
do
LETTRE_ORIGINALE=${ANCIEN_NOM:${x}:1}
LETTRE_CORRIGEE=${NOUVEAU_NOM:${x}:1}
# Comparaison des caractères entre eux
if [[ "${LETTRE_ORIGINALE}" == "${LETTRE_CORRIGEE}" ]]
then
echo -n -e "${LETTRE_CORRIGEE}"
else
echo -n -e "${FUSHIA}${LETTRE_CORRIGEE}${NOIR}"
fi
done
done
# Demande de confirmation du codage à utiliser
echo -e "\n${FUSHIA}${NOMBRE_FICHIERS}${NOIR} fichiers à convertir."
echo -e "
${ROUGE}C${NOIR}e codage est-il le bon ? ? [${ROUGE}O${NOIR}]ui [${ROUGE}N${NOIR}]on [${ROUGE}A${NOIR}]rrêter :"
read -p " --> " BON_CODAGE
if [[ ${BON_CODAGE} == [Aa]* ]]
then
echo -e "\n${ROUGE}Arrêt du script.${NOIR}\n"
exit
elif [[ ${BON_CODAGE} == [OoYy]* ]]
then
convmv -f ${CODAGE} -t utf-8 ${OPTION_R} * --notest &>/dev/null
# Vérification de l’absence de fichier corrompu
if [[ -z $(convmv -f ${CODAGE} -t utf-8 ${OPTION_R} * 2>&1 | egrep "^mv ") ]]
then
echo -e "\n${BLEU}Tous les fichiers ont été renommés.${NOIR}\n"
exit
else
echo -e "\n${ROUGE}Tous les fichiers n'ont pas été renommés.${NOIR}\n"
exit
fi
fi
# Mise au propre du terminal
clear
done
Version ArchLinux
#!/bin/bash
### Variables ###
VERSION="v0.05.$(uname -n)"
# Couleurs du texte affiché dans le shell
FUSHIA="\033[1;35m"
NOIR="\033[1;0m"
BLEU="\033[1;34m"
VERT="\033[1;32m"
ROUGE="\033[1;31m"
# Liste des encodages les plus courants
CODES_LIST="iso-8859-2 iso-8859-3 iso-8859-4 iso-8859-5 iso-8859-6 iso-8859-7 iso-8859-8 iso-8859-9 iso-8859-10 iso-8859-11 iso-8859-13 iso-8859-14 iso-8859-15 iso-8859-16 cp437 cp737 cp775 cp850 cp852 cp855 cp856 cp857 cp860 cp861 cp862 cp863 cp864 cp865 cp866 cp869 cp874 cp932 cp936 cp949 cp950 cp1250 cp1251 cp1252 cp1253 cp1254 cp1255 cp1256 cp1257 cp1258 iso-8859-1"
### Introduction ###
echo -e "
----------------------------------------------------------
${BLEU}Ce script permet de lancer en boucle l'utilitaire convmv qui
permet de convertir les noms de fichiers codés en autre chose
que UTF-8 vers UTF-8. Relancer le script avec l'argument
ALLCODES si jamais aucun résultat n'a été trouvé.
Ex:
sh convmv-to-utf-8.sh /opt/ ALLCODES
${FUSHIA}V${NOIR}ersion ${VERSION}${NOIR}
----------------------------------------------------------"
# Détermination du répertoire à analyser
if [[ "${1}" == "" ]]
then
# On détermine le répertoire courant
echo -e " ${ROUGE}V${NOIR}ous êtes sur le point d'analyser ce répertoire : \n -->${ROUGE} $(pwd)${NOIR}"
else
# On contrôle si le répertoire demandé existe
if [ -d ${1} ]
then
# On se place dans le répertoire
cd ${1}
echo -e " ${ROUGE}V${NOIR}ous êtes sur le point d'analyser ce répertoire : \n -->${ROUGE} $(pwd)${NOIR}"
else
# Le répertoire n'existe pas, on arrête le script
echo -e " ${ROUGE}L${NOIR}e répertoire que vous avez demandé à analyser n'existe pas."
exit
fi
fi
# Vérification de l'existence de convmv
if [[ -z $(pacman -Qs convmv | egrep "convmv") ]]
then
# Propose l'installation direct du logiciel
echo -e " ${ROUGE}L${NOIR}e logiciel convmv n'est pas installé et il est nécessaire au bon fonctionnement de ce script, voulez-vous l'installer ? [${ROUGE}O${NOIR}]ui [${ROUGE}N${NOIR}]on"
read -p " --> " confirmation_installation
# Vérifier le choix de l'installation du logiciel
if [[ ${confirmation_installation} == [OoYy]* ]]
then
pacman -S --noconfirm convmv
echo "----------------------------------------------------------"
else
echo -e " ${ROUGE}V${NOIR}ous n'avez pas souhaité d'installer automatiquement 'convmv'. Ce logiciel est nécessaire au bon fonctionnement du script."
exit
fi
fi
# Pour boucler sur tous les codepages supportés par convmv, il faut mettre ALLCODES en argument
if [[ "${2}" = "ALLCODES" ]]
then
# Affecte tous les codages connus de convmv à la variable CODES_LIST
CODES_LIST=$(convmv --list | tr '\n' ' ')
echo -e "(${ROUGE}L${NOIR}a liste complète des encodages disponibles dans convmv va être utilisée) : \n -->${ROUGE} ${CODES_LIST}"
else
echo -e "(${ROUGE}L${NOIR}a liste simplifiée des encodages disponibles va être utilisée) : \n -->${ROUGE} ${CODES_LIST}"
fi
# Demande de l'utilisation d'une analyse récursive
echo -e "
${ROUGE}V${NOIR}oulez-vous aussi analyser les sous-répertoires ? [${ROUGE}O${NOIR}]ui [${ROUGE}N${NOIR}]on [${ROUGE}A${NOIR}]rrêter :"
read -p " --> " RECURSIVITE
if [[ ${RECURSIVITE} == [Aa]* ]]
then
echo -e "\n ${ROUGE}A${NOIR}rrêt demandé.${NOIR}"
exit
elif [[ ${RECURSIVITE} == [Oo]* ]]
then
echo -e " \n -->${ROUGE} Les sous-répertoires seront analysés."
OPTION_R="-r"
fi
### Boucle principale ###
for CODAGE in ${CODES_LIST}
do
echo -e "\n${BLEU}Hypothèse du codage : ${FUSHIA}${CODAGE}${NOIR}"
# Recherche des fichiers n’étant pas en UTF-8
LISTE_FICHIER=$(convmv -f ${CODAGE} -t utf-8 ${OPTION_R} * 2>&1 | egrep "^mv ")
# Vérifie qu'il y ait bien des fichiers à renommer
if [[ -z ${LISTE_FICHIER} ]]
then
echo -e "\n${ROUGE}Aucune erreur detectée dans les caractères utilisés dans le nom des fichiers.${NOIR}\n"
exit
else
# Nombre de fichier à renommer
NOMBRE_FICHIERS=$(echo "${LISTE_FICHIER}" | wc -l)
echo -e "\n${FUSHIA}${NOMBRE_FICHIERS}${NOIR} fichiers à convertir."
fi
for ((i=1; i<=${NOMBRE_FICHIERS}; i++))
do
LIGNE=$(sed -n ${i}p <<< "${LISTE_FICHIER}")
# Récupération du nom corrompu
ANCIEN_NOM=$(cut -f2 -d '"' <<< "${LIGNE}")
# Récupération du nom corrigé
NOUVEAU_NOM=$(cut -f4 -d '"' <<< "${LIGNE}")
echo -n -e "\n${VERT}Conversion de ${NOIR}"
for (( x=0 ; x <= ${#ANCIEN_NOM} ; x++ ))
do
LETTRE_ORIGINALE=${ANCIEN_NOM:${x}:1}
LETTRE_CORRIGEE=${NOUVEAU_NOM:${x}:1}
# Comparaison des caractères entre eux
if [[ "${LETTRE_ORIGINALE}" == "${LETTRE_CORRIGEE}" ]]
then
echo -n -e "${LETTRE_ORIGINALE}"
else
echo -n -e "${BLEU}${LETTRE_ORIGINALE}${NOIR}"
fi
done
echo -n -e "${VERT} en ${NOIR}"
for (( x=0 ; x <= ${#ANCIEN_NOM} ; x++ ))
do
LETTRE_ORIGINALE=${ANCIEN_NOM:${x}:1}
LETTRE_CORRIGEE=${NOUVEAU_NOM:${x}:1}
# Comparaison des caractères entre eux
if [[ "${LETTRE_ORIGINALE}" == "${LETTRE_CORRIGEE}" ]]
then
echo -n -e "${LETTRE_CORRIGEE}"
else
echo -n -e "${FUSHIA}${LETTRE_CORRIGEE}${NOIR}"
fi
done
done
# Demande de confirmation du codage à utiliser
echo -e "\n${FUSHIA}${NOMBRE_FICHIERS}${NOIR} fichiers à convertir."
echo -e "
${ROUGE}C${NOIR}e codage est-il le bon ? ? [${ROUGE}O${NOIR}]ui [${ROUGE}N${NOIR}]on [${ROUGE}A${NOIR}]rrêter :"
read -p " --> " BON_CODAGE
if [[ ${BON_CODAGE} == [Aa]* ]]
then
echo -e "\n${ROUGE}Arrêt du script.${NOIR}\n"
exit
elif [[ ${BON_CODAGE} == [OoYy]* ]]
then
convmv -f ${CODAGE} -t utf-8 ${OPTION_R} * --notest &>/dev/null
# Vérification de l’absence de fichier corrompu
if [[ -z $(convmv -f ${CODAGE} -t utf-8 ${OPTION_R} * 2>&1 | egrep "^mv ") ]]
then
echo -e "\n${BLEU}Tous les fichiers ont été renommés.${NOIR}\n"
exit
else
echo -e "\n${ROUGE}Tous les fichiers n'ont pas été renommés.${NOIR}\n"
exit
fi
fi
# Mise au propre du terminal
clear
done
Après avoir découvert la superbe commande shell : printenv
je me suis aperçu que l'on pouvait appeler le script comme un simple programme à partir du moment où il est placé dans l'un des répertoires indiqués dans le PATH= (indiqué par la commande printenv) et fait le chmod u+x qui va bien.
Exemples d'utilisation en mode console (dans le cas où le script est enregistré dans un fichier portant le nom conv-utf8.sh) :
(Analyse du répertoire courant)
conv-utf8.sh
(Analyse du répertoire /opt/ en utilisant la liste simplifiée)
conv-utf8.sh /opt/
(Analyse du répertoire /opt/ en utilisant la liste complète)
conv-utf8.sh /opt/ ALLCODES
Par contre, j'avoue ne pas trop savoir dans quel répertoire enregistrer le script au final :
...
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/bin/core_perl
...
Une idée ?