On Sun, Nov 14, 2004 at 07:42:38PM +0100, J.Pierre Pourrez wrote:
> Le script est execut� une fois par semaine, le fichier de 14000 lignes
> est cr�� � chaque fois et correspond aux 14000 paquets de la Sarge.

Optimiser un script qui prend 5 minutes � s'executer toutes
les semaines n'est pas une bonne utilisation de son temps :)


Je vois au moins un changement � faire:

>     # recenser tous les noms de fichiers des paquets dans Packages
>     for PACKAGE in `find $DISTS_DIR -name Packages`; do
>       grep $MOTIF $PACKAGE | sed      "s!$MOTIF!$HOST/!" >> $TMPFILE
>     done
>     # on trie tous les noms de fichiers r�cup�r�s
>     mv $TMPFILE $TMPFILE.orig
>     cat $TMPFILE.orig | sort > $TMPFILE
>     rm $TMPFILE.orig

Je remplacerai tout �a par:

cat `find $DISTS_DIR -name Packages` | grep $MOTIF | sed "s!$MOTIF!$HOST/!" | 
sort > $TMPFILE

(�a marche les points d'exclamation? Mon shell n'a pas l'air
content avec �a...)

>     # on supprime les paquets non recens�s
>     # �ventuellement utiliser l'option -m de grep pour arr�ter
>     # la recherche � la premi�re occurence
>     for FICHIER in `find $HOST -name "*.deb"`; do
>       if [ `grep -c $FICHIER $TMPFILE` = "0" ]; then
>        echo "Remove $FICHIER"
>        rm -f $FICHIER
>        COUNT=$(($COUNT+1))
>       fi
>     done

Ok, c'est donc la partie dont tu parlais � l'origine. Je
n'ai pas d'id�e �vidente; une solution serait de construire
un script sed qui efface les lignes contenues dans $TMPFILE,
et l'appliquer � la sortie du find, donc qqch du genre:

sed -e "s/\//\\\\\//g" -e "s!\(.*\)!/\1/d!" $TMPFILE > $TMPFILE2

(pour se retrouver dans $TMPFILE2 avec des lignes du genre:
/\/var\/lib\/apt-proxy\/blahblah.deb/d
/\/var\/lib\/apt-proxy\/foobar.deb/d
...


Puis:
find $HOST -name "*.deb" | sed -f $TMPFILE2

(on peut alors retirer le `sort` de l'expression du haut, il
ne sert plus).

Selon l'impl�mentation de sed (et si sed arrive � g�rer
14000 lignes de script...), �a peut �tre ou ne pas �tre
plus rapide que ta solution.

Y.

Répondre à