Bayrouni a écrit :
moi :( md5sum "$@" /dev/null 2> /dev/null | awk '{ compteurs[$1]++ if (compteurs[$1] == 1) premiers[$1] = $0 if (compteurs[$1] == 2) print premiers[$1] if (compteurs[$1] > 1) print $0 }' | sort |awk '{ if (dernier != $1) print "" dernier = $1 print }' awk '{ L'idee est astucieuse : on suppose que s'il y a egalite de somme md5 alors il y a egalite de contenu de fichier.
md5sum affiche sur chaque ligne : somme fichier l'idee est n'afficher les sommes et les fichiers que pour les fichiers qui ont des sommes identiques. puis trier par somme, comme ca les fichiers identiques sont rassembles en "serie" que l'on traite. pour cela il faudra memoriser toutes les sommes md5 : l'indice du tableau est le mot dont on veut compter la frequence. C'est un classique de awk compteurs[$1]++ si c'est la premiere fois qu'on voit cette somme, memoriser aussi la ligne comlete si c'est la deuxieme fois qu'on voit la somme, afficher la ligne vue la premier fois si c'est la nieme fois (n >= 2) qu'oit voi la somme, afficher la ligne
awk '{ compteurs[$1]++ if (compteurs[$1] == 1) premiers[$1] = $0 if (compteurs[$1] == 2) print premiers[$1] if (compteurs[$1] > 1) print $0 }' |
ensuite trier par somme : sort ensuite afficher par bloque : si somme-courante differente de somme actuelle afficher un saut de ligne afficher la ligne
sort |awk '{ if (dernier != $1) print "" dernier = $1 print }'
Il y a tout de meme des astuces : compteurs[$1]++ : un grand classique : pour compter les frequences d'un mot ++ fait reference en contexte numerique a un element de tableau [$1] qui existe pas. il est donc cree avec une valeur nulle (0). et if( dernier != $1 ) reference a la variable dernier qui existe pas (a la premiere boucle) elle est donc cree avec une valeur vide.