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 :
Après recherche, le problème semble se situer au niveau de la manipulation du séparateur de champ ($IFS).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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)"
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.......
Partager