#1 Le 13/12/2007, à 15:56
- jerepain
[bash]Compter les fichiers redondants
Bonjour,
Je dois faire un script pour compter les fichiers redondants dans un répertoire.
Voilà ce que j'ai fait :
for j in *
do
for i in *
do
ii=`echo $i`
jj=`echo $j`
k=`diff -q $ii $jj`
if [ -z "$k" ]
then
let "o=$o+1"
fi
done
done
echo "Il y a $o fichiers redondants !!"
Seulement le fait d'imbriquer les 2 'for' fait compter plusieurs fois la même chose...
#2 Le 13/12/2007, à 16:22
- freebird
Re : [bash]Compter les fichiers redondants
Tu veux un compteur global de fichiers redondants comme seul résultat ?
Edit : vu que dans ton calcul tu comptes :
- 1 fois chaque fichier
- 2 fois chaque fichier identique
Tu prends le total que tu as, tu y enlèves le nombre total de fichiers et tu divises par 2
Ouais c'est sauvage comme méthode mais ça marche
Second edit : en fait non ça ne va pas, si 3 fichiers sont identiques il va te dire qu'il y en a 4
Dernière modification par freebird (Le 13/12/2007, à 16:37)
Hors ligne
#3 Le 14/12/2007, à 14:57
- coca25
Re : [bash]Compter les fichiers redondants
une proposition:
#!/bin/bash
liste=( * )
nombre=$(( $(ls | wc -l) - 1))
resultat=0
for i in $(seq 0 $nombre)
do
for j in $(seq $(($i + 1)) $nombre)
do
echo -n Comparaison de "${liste[$i]}" et "${liste[$j]}"
if diff -q "${liste[$i]}" "${liste[$j]}" > /dev/null
then
echo -n " +1"
resultat=$(($resultat + 1))
fi
echo
done
done
echo "Il y a $resultat couple de fichiers identiques !!"
Dernière modification par coca25 (Le 14/12/2007, à 22:40)
Hors ligne
#4 Le 14/12/2007, à 21:27
- jerepain
Re : [bash]Compter les fichiers redondants
Ton code ne fonctionne pas, mais je te remercie quand même pour le dérangement
Il me dit qu'il y a 6 couples de fichiers redondants, alors que dans mon répertoire j'ai 6 fichiers donc 4 redondants.
#5 Le 14/12/2007, à 22:39
- coca25
Re : [bash]Compter les fichiers redondants
parce qu'il t'affiche le nombre de couples (les 4 fichiers sont identiques), je pensais que tu voulais le nombre de couples et non pas les fichiers, sinon, il suffit de modifier un peu:
#!/bin/bash
liste=( * )
inode_liste=( $(stat -c %i *) )
nombre=$(( $(ls | wc -l) - 1))
traite="1"
resultat=0
for i in $(seq 0 $nombre)
do
for j in $(seq $(($i + 1)) $nombre)
do
echo Comparaison de "${liste[$i]}" et "${liste[$j]}"
if diff -q "${liste[$i]}" "${liste[$j]}" > /dev/null
then
if ! echo $traite | grep -q ",${inode_liste[$i]}"
then
traite="$traite,${inode_liste[$i]}"
resultat=$(($resultat + 1))
fi
if ! echo $traite | grep -q ",${inode_liste[$j]}"
then
traite="$traite,${inode_liste[$j]}"
resultat=$(($resultat + 1))
fi
fi
done
done
echo "Il y a $resultat fichiers redondants"
Dernière modification par coca25 (Le 14/12/2007, à 23:40)
Hors ligne
#6 Le 14/12/2007, à 23:27
- jerepain
Re : [bash]Compter les fichiers redondants
Merci, tu es un Dieu
Par contre y'a pas mal de choses que je ne comprends pas dans ton code :
-A quoi sert inode_liste ?
Que fait ceci :
traite="$traite,${inode_liste[$i]}"
Merci
#7 Le 14/12/2007, à 23:38
- coca25
Re : [bash]Compter les fichiers redondants
pour ne pas recompter les fichiers, il fallait les mettre dans une liste, je pouvais mettre le nom, mais il peut contenir un espace ou une "," etc...
le truc unique au fichier auquel j'ai pensé est l'inode
Dernière modification par coca25 (Le 14/12/2007, à 23:40)
Hors ligne
#8 Le 15/12/2007, à 13:34
- jerepain
Re : [bash]Compter les fichiers redondants
Merci, j'ai compris maintenant