Aurélien Beaujean <[EMAIL PROTECTED]> - Tue, Sep 10, 2002:

> PS: c'est vrai qu'une archive par mois au format mbox serait le
> bienvenu. Quelqu'un se dévoue pour nous faire un petit script à base de
> de cron et de grepmail pour que je les publient sut muttfr.org ? :)

   J'ai bien un bidule qui ressemble sous la main :

 Tous les jours je vérifie qu'il n'y a pas de mail vieux de plus de N
 jours dans une liste de boîtes.

 Inconvénient majeur : il fonctionne sur les boîtes au format Maildir,
 et pas mbox.

 Explication : si vous voulez supprimer un mail d'une boîte assez grosse
 avec formail, il faut l'utiliser en filtre et en même temps l'appeler
 pour récupérer le champ "Date:" dans les headers ce qui implique soit
 une boucle en n² (ou n est le nombre de messages à traiter dans la
 boîte) ou bien une duplication de la boîte (dans ce cas autant utiliser
 procmail).

   Cependant, j'ai converti mes boîtes au format Maildir, et
 c'est un vrai bonheur. Il est plus rapide de déplacer, supprimer
 un message, surtout dans ce genre de scripts. En plus il est
 possible de faire des constructions shell agréables comme
 "for message in mailbox/cur/*; do ... done"

   Bref, j'attache mon bousin, il me permet de supprimer les messages
 de listes archivées sur le net pour que les boîtes ne grossissent pas
 trop. Ça peut servir à quelqu'un.


   Je suppose que c'est _beaucoup_ plus facile à faire dans le cas
 où on duplique la mbox sans supprimer de message, en gros c'est un
 formail -s.


   Enfin, la solution qui tue dans ce cas particulier :

      :0:
      * mutt
      /var/www/mutt/`date +%y-%m`-mutt

 ... ou quelque chose d'approchant en intégrant les précédentes
 propositions de procmail.


-- 
Loïc Minier <[EMAIL PROTECTED]>
#!/bin/sh

# deletes mail older than a specified date in mailboxes in Maildir
# format

TEMP=`getopt -o vh --long verbose,help -n $0 -- "$@"`

[ $? != 0 ] && (echo "Terminating..." >&2; exit 1)

eval set -- "$TEMP"

VERBOSE=0

while true ; do
    case "$1" in
        -v|--verbose) VERBOSE=1; shift;;
        -h|--help) echo "Usage: $0 [-v|--verbose] [-h|--help]"; exit 0; shift;;
        --) shift; break;;
        *) echo "Internal error!"; exit 1;;
    esac
done

say()
{
    [ $VERBOSE -eq 1 ] && echo $1
}

del_box()
{
    say "processing $1"
    (rmdir ~/mail/$1/cur/ 2>/dev/null && mkdir ~/mail/$1/cur/) \
    || for j in ~/mail/$1/cur/*
       do
           k="`formail -x Date < $j`"
           d="`date -d "$k" +%s`"
           if [ "$d" ]
           then
               delta=$(($3 - $d))

               if [ $delta -gt $2 ]
               then
                   rm -f "$j"
               fi
           else
               echo "problem with $j in $i" >&2
           fi
       done

}

for i in \
        "2-h"                 \
        "via/anciens"         \
        "via/batavia"         \
        "via/bruit"           \
        "via/diff"            \
        "via/perms"           \
        "via/roots"           \

do
    del_box $i 1814400 `date +%s`       # 21 days from now
done

for i in \
        "debian/security"     \
        "security/bugtraq"    \
        "spam"                \
        "via/fw/firewall"     \
        "via/fw/top-50-ext"   \
        "via/fw/top-50-proxy" \
        "vl/announce"         \
        "vl/libdvbpsi-devel"  \
        "vl/libdvdcss-devel"  \
        "vl/libdvdplay-devel" \
        "vl/vlc-devel"        \
        "vl/vlcs"             \
        "vl/vlcs-devel"       \
        "vl/vls-devel"        \
        "via/nt"              \
        "via/via"             \

do
    del_box $i 604800 `date +%s`        # 7 days from now
done

Répondre à