OVH Cloud OVH Cloud

effacer les doublons dans un répertoire

6 réponses
Avatar
Yves Kuhry
Bonjour,

Suite à un problème du serveur de mails de la fac (virus ?),
les messages stockés ont été répartis aléatoirement sur les comptes
des divers utilisateurs. Ma machine est configurée pour rapatrier
automatiquement les mails toutes les 5 minutes, et du coup, je me suis
retrouvé avec plus de 10,000 mails et mon disque dur saturé.
En fait, beaucoup de ces mails sont présents en un grand nombre d'exemplaires avec parfois l'adresse du destinataire qui change.

Je voudrais donc écrire un script qui efface tous les doublons.
J'utilise sylpheed, donc les mails sont stockés dans un répertoire sous forme de fichiers (un par mail) identifiés par leur numéro d'ordre.

Je cherche un moyen de ne garder plus qu'un exemplaire de chacun des
fichiers pour pouvoir les redispatcher à leurs destinataires respectifs.
J'ai pensé à comparer les fichiers sur la base de leur taille et du sujet. Tans pis si quelques-uns passent à la trappe.

Pour l'instant j'ai tapé ça :

#!/bin/sh

rm=/bin/rm

# créer un fichier trié avec en colonnes la taille et le nom
# des fichiers (>=1,1K)
# Le dernier grep vire la ligne "total" et les fichiers de moins
# 1,1K

ls -l -h --sort=size [0-9]* \
| sed -e "s/^.* \([0-9],*[0-9]*[MK]\).* \([0-9]\+\)/\1 \2/" \
| grep -v "[tr]" > sorted

# tailles de fichier par ordre décroissant
grep -o "^[0-9],*[0-9]*[MK]" sorted | uniq > tailles


while read size
do
# créer un répertoire où sont déplacés les fichiers de taille # $size

if [ ! -d $size ]
then
mkdir $size
fi

for file in `grep $size sorted | grep -o "[0-9]\+$"`
do
# pour l'instant je fais un cp
mv $file $size
done

# lister les sujets *différents* dans ces fichiers
grep -h "Subject:" $size/* | uniq > $size/subjects


# ne recopier que les fichiers avec des sujets distincts
# dans le répertoire original

while read subj
do
mv `grep -l "$subj" $size/* | head -1` ./ # /!\ ICI
done < $size/subjects

$rm -rf $size

done < tailles

Le problème vient des sujets qui peuvent contenir des caractères spéciaux (comme [] pour les listes de diffusion) à protéger par des
backslash. Il faut donc d'abord transformer $subj pour que le bon
argument soit passé à grep, et la je rame.
J'ai mis le script en entier, parce que c'est du gros bricolage et si
vous avez des conseils pour l'améliorer, ils sont les bienvenus.


Merci

--
Yves Kuhry

6 réponses

Avatar
Pascal Bourguignon
Yves Kuhry writes:

Bonjour,

Suite à un problème du serveur de mails de la fac (virus ?), les
messages stockés ont été répartis aléatoirement sur les comptes des
divers utilisateurs. Ma machine est configurée pour rapatrier
automatiquement les mails toutes les 5 minutes, et du coup, je me
suis retrouvé avec plus de 10,000 mails et mon disque dur saturé.
En fait, beaucoup de ces mails sont présents en un grand nombre
d'exemplaires avec parfois l'adresse du destinataire qui change.

Je voudrais donc écrire un script qui efface tous les doublons.
J'utilise sylpheed, donc les mails sont stockés dans un répertoire
sous forme de fichiers (un par mail) identifiés par leur numéro
d'ordre.

Je cherche un moyen de ne garder plus qu'un exemplaire de chacun des
fichiers pour pouvoir les redispatcher à leurs destinataires
respectifs. J'ai pensé à comparer les fichiers sur la base de leur
taille et du sujet. Tans pis si quelques-uns passent à la trappe.

Pour l'instant j'ai tapé ça :
[...]


Les messages sont identifiés de manière unique avec... tada! le Message-ID!

mkdir ../messages-uniques
cp $(grep -ni '^Message-ID:' * | sort -u -t: +1 | sed -e 's/:.*//')
../messages-uniques/

On peut encore avoir des doublons dans le cas des virus ou du spam si
ils envoyent plusieurs messages contenant le même texte. On peut
alors résoudre le problème en faisant un md5sum sur le corps du
message:

cp $(for msg in * ; do
echo ${msg}:$(awk 'BEGIN{h=1;}/^$/{h=0;}{if(h==0){print $0}}'<$msg
| md5sum -b);
done | sort -u -t: +1 | sed -e 's/:.*//') ../messages-uniques



--
__Pascal Bourguignon__ http://www.informatimago.com/

To vote Democrat or Republican, it's like changing of cabin in the Titanic.

Avatar
DIG
On Sun, 3 Oct 2004 00:46:24 +0200, wrote:

[...]

Je cherche un moyen de ne garder plus qu'un exemplaire de chacun des
fichiers pour pouvoir les redispatcher à leurs destinataires respectifs.
J'ai pensé à comparer les fichiers sur la base de leur taille et du sujet.
Tans pis si quelques-uns passent à la trappe.


Je pense que pour ne pas réinventer la roue, il vous faut utiliser
``formail'' (formail - mail (re)formatter). Apparemment, l'option
``-D'' c'est exactement ce qu'il vous faut :

,---[ man formail ]---
| -D maxlen idcache
| Formail will detect if the Message-ID of the current
| message has already been seen using an idcache file
| of approximately maxlen size. If not splitting, it
| will return success if a duplicate has been found.
| If splitting, it will not output duplicate messages.
| If used in conjunction with -r, formail will look at
| the mail address of the envelope sender instead at
| the Message-ID.
`---[ ]---


A plus tard,

--
DIG (Dmitri I GOULIAEV)
Aahz's law: The best way to get information on usenet is
not to ask a question, but to post the wrong information.

Avatar
Yves Kuhry
Les messages sont identifiés de manière unique avec... tada! le Message-ID!

Caramba! Comment n'y ai je pas pensé ?


mkdir ../messages-uniques
cp $(grep -ni '^Message-ID:' * | sort -u -t: +1 | sed -e 's/:.*//')
../messages-uniques/

2 lignes ! je me sens un peu ridicule avec mon gros script tout à coup.


On peut encore avoir des doublons dans le cas des virus ou du spam si
ils envoyent plusieurs messages contenant le même texte. On peut
alors résoudre le problème en faisant un md5sum sur le corps du
message:

cp $(for msg in * ; do
echo ${msg}:$(awk 'BEGIN{h=1;}/^$/{h=0;}{if(h==0){print $0}}'<$msg
| md5sum -b);
done | sort -u -t: +1 | sed -e 's/:.*//') ../messages-uniques



Bon, ben là rien à dire, respect.
Je vais étudier ça afin de comprendre les détails, merci beaucoup.
Merci aussi à Dmitri. Formail est installé sur ma machine, je vais
essayer de comprendre comment ça marche.

--
Yves Kuhry

Avatar
Pascal Bourguignon
Yves Kuhry writes:

Les messages sont identifiés de manière unique avec... tada! le Message-ID!

Caramba! Comment n'y ai je pas pensé ?


mkdir ../messages-uniques
cp $(grep -ni '^Message-ID:' * | sort -u -t: +1 | sed -e 's/:.*//')
../messages-uniques/

2 lignes ! je me sens un peu ridicule avec mon gros script tout à coup.



Non, il ne faut pas. Ce qui compte, c'est de bien comprendre ce qu'on
écrit. Si ça doit faire 20 lignes, ça peut être plus clair qu'avec
deux lignes. Il y a des auteurs qui écrivent comme Proust, et il y a
des auteurs qui écrivent comme Matsuo Basho.


On peut encore avoir des doublons dans le cas des virus ou du spam si
ils envoyent plusieurs messages contenant le même texte. On peut
alors résoudre le problème en faisant un md5sum sur le corps du
message:

cp $(for msg in * ; do
echo ${msg}:$(awk 'BEGIN{h=1;}/^$/{h=0;}{if(h==0){print $0}}'<$msg
| md5sum -b);
done | sort -u -t: +1 | sed -e 's/:.*//') ../messages-uniques



Bon, ben là rien à dire, respect.
Je vais étudier ça afin de comprendre les détails, merci beaucoup.
Merci aussi à Dmitri. Formail est installé sur ma machine, je vais
essayer de comprendre comment ça marche.

--
Yves Kuhry


--
__Pascal Bourguignon__ http://www.informatimago.com/

To vote Democrat or Republican, it's like changing of cabin in the Titanic.


Avatar
Yves Kuhry
On 03 Oct 2004 18:40:04 +0200
Pascal Bourguignon wrote:

Yves Kuhry writes:


2 lignes ! je me sens un peu ridicule avec mon gros script tout à coup.



Non, il ne faut pas. Ce qui compte, c'est de bien comprendre ce qu'on
écrit. Si ça doit faire 20 lignes, ça peut être plus clair qu'avec
deux lignes. Il y a des auteurs qui écrivent comme Proust, et il y a
des auteurs qui écrivent comme Matsuo Basho.




N'empêche que je serai content,le jour ou je maîtriserai suffisamment
les options de grep, sed et compagnie pour écrire des haikus moi aussi.
Merci pour le Proust, tu aurais pu dire Sulitzer.


--
Yves Kuhry



Avatar
Stephane Chazelas
2004-10-03, 04:57(+02), Pascal Bourguignon:
[...]
mkdir ../messages-uniques
cp $(grep -ni '^Message-ID:' * | sort -u -t: +1 | sed -e 's/:.*//')
../messages-uniques/


Notes:

Au lieu de sed '...', on peut utiliser cut -d: -f1


On peut encore avoir des doublons dans le cas des virus ou du spam si
ils envoyent plusieurs messages contenant le même texte. On peut
alors résoudre le problème en faisant un md5sum sur le corps du
message:

cp $(for msg in * ; do
echo ${msg}:$(awk 'BEGIN{h=1;}/^$/{h=0;}{if(h==0){print $0}}'<$msg
| md5sum -b);
done | sort -u -t: +1 | sed -e 's/:.*//') ../messages-uniques


Au lieu de:

awk 'BEGIN{h=1;}/^$/{h=0;}{if(h==0){print $0}}'<$msg

On peut utiliser:

sed '/^$/,$!d'

ou

awk 'NR==1,$0=""'
(nawk ou /usr/xpg4/bin/awk sous Solaris).

--
Stephane