[SH] Script qui dysfonctionne sur Mint mais pas sur Mageia ?
Bonsoir tout le monde,
Je fais appel à vous en désespoir de cause :
Ne trouvant un logiciel qui me convienne exactement, je me suis bricolé (ou plus exactement adapté) un script pour nettoyer les répertoires en cas de copie de sauvegarde
MAIS
je me suis rendu compte que mon script ne fonctionne pas sur Mint 18 32 bits (alors qu'il fonctionne sur Mageia 5 et 6).
Voici le script qui pose problème :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
|
#!/bin/sh
# Adapte de : nicofo - http://nicofo.tuxfamily.org
# 24/06/07 - 24/04/2012
#compare 2 dossiers et supprimme les fichiers identiques au niveau nom et taille
read -p "Dossier 1 (Ne sera pas modifié) : " DIR1 || DIR1="$1"
[ ! -d "$DIR1" ] && echo "'$DIR1' n'est pas un dossier !" && exit 1
read -p "Dossier 2 (Les fichiers en double seront supprimmés): " DIR2 || DIR2="$2"
[ ! -d "$DIR2" ] && echo "'$DIR2' n'est pas un dossier !" && exit 1
#remplacer "/" par "\/" (pour le sed)
DIR1m=$(echo "$DIR1"|sed "s#/#\\\/#g")
DIR2m=$(echo "$DIR2"|sed "s#/#\\\/#g")
[ "$DIR1" == "$DIR2" ] && echo "Dossier 1 et Dossier 2 sont identiques" && exit 1
HEUREDEBUT=$(date +'%s')
file2="/tmp/compDossier2"
#ajouter le cas échéant un "/" final aux noms de dossier
[ -z "$(echo "$DIR1"|grep "/$")" ] && DIR1="$DIR1/"
[ -z "$(echo "$DIR2"|grep "/$")" ] && DIR2="$DIR2/"
#lister le dossier 2 (celui dont les fichiers vont être supprimmés)
echo -en "\r\033[K\033[1;34mPréparation : listage de \"$DIR2\" ...\033[0m"
find "$DIR2" | sed "s/^$DIR2m//" >$file2
echo -e "\r\033[K\033[1;34mSuppression des fichiers identiques par leur nom et leur taille:\033[0m"
echo "(espace) = Répertoire. Ne rien faire."
echo " . = Différence entre les 2 fichiers comparés. Ne rien faire."
echo " : = Les 2 fichiers comparés sont identiques. Effacer le fichier de l'ancien répertoire de sauvegarde."
echo ""
NbLignes=`more $file2 | wc -l`
echo "Nombre de fichiers et répertoires a vérifier : " $NbLignes
Pas=$(expr $NbLignes / 100)
echo "Taille du répertoire 2 AVANT traitement : "
TailleAvant=`du -s "$DIR2"| awk -F" " '{ print $1 }'`
echo $TailleAvant " Octets"
# Si le fichier est présent dans le DIR2 et qu'il a la même taille que sur DIR1 -> Effacer. Si non, ne rien faire
echo ""
echo "Début du Traitement ..."
old_IFS=$IFS # sauvegarde du séparateur de champ
IFS=\$'\r\n' # nouveau séparateur de champ, le caractère fin de ligne
i=-1
j=0
k=0
for ligne in $(cat $file2)
do
i=$((++i))
#echo $i " / " $j
if [ $i -ge $j ]; then
j=$((j+Pas))
k=$((++k))
echo -n " $k% " # indiquer le pourcentage pour avoir une idée de l'avancement
fi
#echo $DIR1$ligne " / " $TAILLE1 " // " $TAILLE2 " / " $DIR2$ligne " | " $ligne
# Si la ligne a tester contient un nom de fichier suivre le traitement normal, si nom de repertoire, passer a la ligne suivante
if [ `stat -c %F $DIR2$ligne` 2>/dev/null = 'fichier' ]; then
if [ `stat -c %s $DIR1$ligne 2>/dev/null` = `stat -c %s $DIR2$ligne` 2>/dev/null ]; then
rm -f "$DIR2$ligne"
echo -n ":" # Si identique = Supp
#echo $DIR2$ligne
else
echo -n "." # Si différents = Suivant
#echo $ligne
fi
else
echo -n " " # Si répertoire = Suivant
#echo $ligne
fi
done
IFS=$old_IFS # rétablissement du séparateur de champ par défaut
TailleApres=`du -s "$DIR2"| awk -F" " '{ print $1 }'`
echo ""
echo " Taille du répertoire 2 APRES traitement : " $TailleApres " Octets"
GainTaille=$(expr $TailleApres - $TailleAvant)
GainTailleKo=$(expr $GainTaille / 1024)
echo "Gain de place : " $GainTaille " Octets (" $GainTailleKo " KiloOctets)"
rm $file2
HEUREFIN=$(date +'%s')
DureeExecution=$(($HEUREFIN - $HEUREDEBUT))
DureeExecutionM=$(expr $DureeExecution / 60)
echo "Durée du traitement : " $DureeExecution " Secondes (" $DureeExecutionM " Minutes)" |
Après recherche, le problème semble se situer au niveau de la manipulation du séparateur de champ ($IFS).
SI je passe un répertoire ou un fichier contenant 'r' ou 'n', le répertoire se scinde en 2 lignes, ce qui engendre une erreur.
(exemple : /home/toto/martie/Documents se traduit au niveau du script par 2 lignes : /home/toto/ma et tie/Documents)
J'ai tout essayé : En elevant ce changement de caractère, en le modifiant vers \r seul ou \n seul, en bash, en ksh, ....
Quelqu'un peut-il me dire comment faire pour que ce script fonctionne sur les 2 plateformes SVP ?
Cela me ferais très plaisir car je commence à ne plus avoir beaucoup de cheveux :) .......