Quelle idée à la con de mettre de la couleur sur les différences :p
après 1h30 de test :
#! /bin/bash
# Définition des couleurs pour echo -e
FUSHIA="\033[1;35m"
BLEUFONCE="\033[1;34m"
ROUGE="\033[1;31m"
NOIR="\033[1;0m"
# Utiliser les arguments lu par le script
while getopts ":arfh" Option
do
case $Option in
# Si c'est l'option -a (all) alors on vérifie également le nom du dossier dans lequel on se trouve
a ) arg_a="0" ;;
# Pour limiter la recherche uniquement au contenu du dossier et non aux sous dossiers
r ) arg_r="-maxdepth 1" ;;
# Si c'est l'option -f alors on ne fait une recherche que sur les fichiers
f ) arg_f="-type f" ;;
# Si c'est l'option -i alors voila quelques infos
h ) echo -e "\n${FUSHIA}Options disponibles :
${FUSHIA}-a : ${BLEUFONCE}Permet de traiter également le nom du dossier courant. ${FUSHIA}Inutile avec -f.
${FUSHIA}-r : ${BLEUFONCE}Ne traite pas les sous dossiers, ne traite que les éléments présents dans le dossier courant.
${FUSHIA}-f : ${BLEUFONCE}Permet de ne traiter que les fichiers sans traiter les dossiers. ${FUSHIA}Inutile avec -a.${NOIR}\n" && exit 0 ;;
# SI l'option n'existe pas, arrêt du script
* ) echo -e "\n${ROUGE}Option indisponible, arret du script !${NOIR}\n" && exit 1 ;;
esac
done
shift $(($OPTIND - 1))
echo -e "${BLEUFONCE}Pour plus d'informations, utilisez l'option ${FUSHIA}-h${NOIR}."
sleep 1
# 1 - Recherche dans le dossier actuel
# 2 - Recherche d'abord les sous-fichiers
# 3 - Verifie arg_a, si indisponible alors cela sera : -mindepth 1
# 4 - Utilise arg_r si activé pour limité la recherche au dossier actuel sans les sous dossiers
# 5 - Utilise arg_f si activé pour limité la recherche aux fichiers
# find "${PWD}" -depth -mindepth -maxdepth -type
find "${PWD}" -depth -mindepth ${arg_a:-1} ${arg_r} ${arg_f} > /tmp/liste_originale.txt
# Iconv test chaque format jusqu'à l'arret par l'utilisateur
for code in "iso-8859-1" "CP437" "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" "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"
do
# Annonce le format utilisé
echo -e "\n${BLEUFONCE}Test avec pour format original ${FUSHIA}${code}${NOIR}.\n"
# Iconv crée un nouveau fichier avec le nouveau codage
iconv -f ${code} -t UTF-8 /tmp/liste_originale.txt -o /tmp/liste_corrige.txt 2>/tmp/liste_erreur.txt
# Si le fichier d'erreur de iconv n'est pas vide, on saute la boucle en cours
if [[ -s /tmp/liste_erreur.txt ]]
then
# Annonce lque ce ne peut être ce format
echo -e "${ROUGE}Il est certain que ce n'est pas le codage : ${code}.${NOIR}"
# On saute ce format qui n'est pas le bon"
continue
fi
# Compare les 2 fichiers et y supprime les lignes identiques dans les 2 fichiers
cat /tmp/liste_originale.txt | while read ligne
do
fichier="${ligne##*/}"
if [[ -n $(egrep "${fichier}$" /tmp/liste_corrige.txt) ]]
then
sed -i "/${fichier}$/d" /tmp/liste_corrige.txt
sed -i "/${fichier}$/d" /tmp/liste_originale.txt
fi
done
# Suppression du fichier avec les differences couleurs
if [[ -e /tmp/liste_couleur.txt ]]
then
rm /tmp/liste_couleur.txt
fi
# Calcul du nombre de ligne à faire sinon boucle à l'infinie
max_ligne=$(wc -l /tmp/liste_originale.txt)
# On boucle sur les lignes afin de les faire 1 à 1
for (( a=1 ; a <= ${max_ligne%% *} ; a++ ))
do
# récupération de la ligne "a" à utiliser pour liste_originale.txt
ligne_originale=$(sed -n ${a}p /tmp/liste_originale.txt)
# récupération de la ligne "a" à utiliser pour liste_corrige.txt
ligne_corigee=$(sed -n ${a}p /tmp/liste_corrige.txt)
# Boucle sur les carac afin de les traiter 1 à 1 avec pour max le nombre de caractere de la ligne originale
for (( b=0 ; b <= ${#ligne_originale} ; b++ ))
do
# Comparaison des caracteres entre eux
if [[ "${ligne_originale:${b}:1}" == "${ligne_corigee:${b}:1}" ]]
then
# S'ils sont identiques on les envoie 1 à 1 dans le fichier /tmp/liste_couleur.txt
echo -n "${ligne_corigee:${b}:1}" >> /tmp/liste_couleur.txt
else
# S'ils sont différent on les envoie 1 à 1 entouré de balise de couleur dans le fichier /tmp/liste_couleur.txt
echo -n "${BLEUFONCE}${ligne_corigee:${b}:1}${NOIR}" >> /tmp/liste_couleur.txt
fi
done
# On fait un retour entre les lignes sinon tout se suit
echo >> /tmp/liste_couleur.txt
done
# On charge les lignes avec cat mais on utilise
echo -e "$(cat /tmp/liste_couleur.txt)"
# On demande confirmation du résultat par l'utilisateur
echo -e "\n${BLEUFONCE}Ce codage est-il le bon ?${NOIR}"
read -p "[O]ui/[N]on/[E]xit : " codage_ok
# Si l'utilisateur est ok avec le codage, on arrete la boucle
# Si la variable codage_ok commence par "O" ou "o", c'est bon
if [[ ${codage_ok} == [Oo]* ]]
then
# Arret de la boucle, on passe à la suite
break
elif [[ ${codage_ok} == [Ee]* ]]
then
# Suppression des fichiers txt
rm /tmp/liste_originale.txt /tmp/liste_corrige.txt /tmp/liste_erreur.txt /tmp/liste_couleur.txt
# Arret du script
exit 1
fi
done
# Si la boucle s'est terminée sans que l'utilisateur accepte l'encodage
if [[ ${codage_ok} != [Oo]* ]]
then
echo -e "\n${ROUGE}Le script n'a pas réussis à trouver le bon codage original.
Désolé mais le script s'arrete là.${NOIR}\n"
# Suppression des fichiers txt
rm /tmp/liste_originale.txt /tmp/liste_corrige.txt /tmp/liste_erreur.txt /tmp/liste_couleur.txt
# Arret du script
exit 1
fi
# Un petit saut de ligne :)
echo
# Traite les adresses complétes origineles 1 par 1
cat /tmp/liste_originale.txt | while read nom
do
# Récupération de l'adresse du fichier
adresse_origine=${nom%/*}
# Récupération du nom du fichier
nom_origine=${nom##*/}
# Récupération de l'adresse compléte
corrige=$(head -1 /tmp/liste_corrige.txt)
# Récupération du nouveau nom du fichier
nom_corrige=${corrige##*/}
# Si les 2 noms sont différents
if [[ "${nom_origine}" != "${nom_corrige}" ]]
then
# Affiche l'ancienne adresse et la nouvelle
echo -e "${BLEUFONCE}${nom_origine}${NOIR} devient ${FUSHIA}${nom_corrige}${NOIR}."
# Renomme le fichier avec le nouveau nom
mv "${nom}" "${adresse_origine}"/"${nom_corrige}"
fi
# On supprime la ligne venant d'être lue, la 1ere
sed -i "1d" /tmp/liste_corrige.txt
done
# Suppression des fichiers txt
rm /tmp/liste_originale.txt /tmp/liste_corrige.txt /tmp/liste_erreur.txt /tmp/liste_couleur.txt
# Arret du script
exit 0
Screenshot :
Voila comment ça se présente sans option, donc dossiers et fichiers de façon récursif sans le dossier dans le quel on se trouve.
Option -f qui ne montre que les fichiers :
Option -r qui n'est pas récursif :
Options -r et -f, il n'affiche que les fichiers du dossier courant :
Option -a, traite également le dossier courant :
Options -r et -a, traite le dossier courant mais pas les sous-dossiers :
Option -h, une petite aide
Code qui m'a fait réfléchir a 2-3h du mat alors que je suis malade...
# Calcul du nombre de ligne à faire sinon boucle à l'infinie
max_ligne=$(wc -l /tmp/liste_originale.txt)
# On boucle sur les lignes afin de les faire 1 à 1
for (( a=1 ; a <= ${max_ligne%% *} ; a++ ))
do
# récupération de la ligne "a" à utiliser pour liste_originale.txt
ligne_originale=$(sed -n ${a}p /tmp/liste_originale.txt)
# récupération de la ligne "a" à utiliser pour liste_corrige.txt
ligne_corigee=$(sed -n ${a}p /tmp/liste_corrige.txt)
# Boucle sur les carac afin de les traiter 1 à 1 avec pour max le nombre de caractere de la ligne originale
for (( b=0 ; b <= ${#ligne_originale} ; b++ ))
do
# Comparaison des caracteres entre eux
if [[ "${ligne_originale:${b}:1}" == "${ligne_corigee:${b}:1}" ]]
then
# S'ils sont identiques on les envoie 1 à 1 dans le fichier /tmp/liste_couleur.txt
echo -n "${ligne_corigee:${b}:1}" >> /tmp/liste_couleur.txt
else
# S'ils sont différent on les envoie 1 à 1 entouré de balise de couleur dans le fichier /tmp/liste_couleur.txt
echo -n "${BLEUFONCE}${ligne_corigee:${b}:1}${NOIR}" >> /tmp/liste_couleur.txt
fi
done
# On fait un retour entre les lignes sinon tout se suit
echo >> /tmp/liste_couleur.txt
done
# On charge les lignes avec cat mais on utilise
echo -e "$(cat /tmp/liste_couleur.txt)"
je pense que tu devrait pouvoir le réutiliser (pas regarde pour ton script), mais en gros :
- Une boucle qui travaille sur les lignes des listes avec pour maximum le nombre de ligne d'un de ces fichiers (ils ont autant de lignes, car les lignes ne posant pas de problème ont été supprimé avant).
- On récupère les lignes à tester sur chaque liste (même ligne pour les 2)
- On crée une autre boucle qui travaille sur les caractères, 1 à 1
- On compare les caractères l'un par rapport à l'autre, s'ils sont identique, on les envoie comme ça dans un autre fichier, s'ils sont différents on les encadre des fonctions de couleur.
- On lit le nouveau fichier contenant les codes couleurs, je n'ai pas trouvé comment faire avec simplement echo ou cat, j'ai donc fais un mixe des 2.
- Ce fichier n'est utilisé bien évidemment que pour être affiché.
Voilou, si vous avez d'autres idées ou questions 🙂
PS : merci de me signaler les fautes :p
Un bug de vu mais je ne sais pas comment le résoudre en fait : si après modif on repasse le script, il ne sait plus lire les noms qui sont UTF-8...