[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Rechercher une ligne dans un gros fichier trié



Le 14/11/04 à 19:03, Francois@mescam.org écrivait:

> Si chaque fois est suite à une action d'un opérateur humain les délais de grep
> sont raisonnables. je viens de faire un test (portable PIII 500Mhz, 512 Mo) : 
> $ time grep -e 'zzzzzzzz' *
> 
> real	0m0.071s
> user	0m0.030s
> sys	0m0.040s
> $ pwd
> /usr/share/doc/postgresql-doc/html
> $ wc -l *|grep total
>  329529 total
> $ du -hs
> 6,4M	.

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.

Le but est de suuprimer les paquets obsolètes dans le cache de
apt-proxy. Voici où j'en suis arrivé

=========== cut here ===============================
#!/bin/sh 

# supprime tous les packages obsolètes (non référencés dans les fichiers
# Packages) dans le cache d'Apt-proxy

TMPFILE=`mktemp -t purge.XXXXXX`
trap "rm -f $TMPFILE" 0 1 2 5 15

MOTIF="^Filename: "

# récupère la valeur de APT_PROXY_CACHE
APT_PROXY_CACHE=`grep "^APT_PROXY_CACHE=" /etc/apt-proxy/apt-proxy.conf | \
  cut -d = -f 2`

COUNT=0

for H in `ls $APT_PROXY_CACHE`; do
  HOST="$APT_PROXY_CACHE/$H"
  echo "============== Host: $HOST ========================="
  if [ -d "$HOST" ]; then
    rm $TMPFILE
    touch $TMPFILE
    # certains sites n'ont pas de répertoire dists (E.G.: http://z42.de)
    DISTS_DIR="$HOST/dists"
    if [ ! -d "$DISTS_DIR" ]; then DISTS_DIR="$HOST"; fi
    # 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
    # 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
  fi
done
N=`wc -l $TMPFILE`
echo -e "\nSweeping apt-proxy cache...\n$COUNT packets deleted / $N known packets\n"

======================= cut here =======================================

C'est vrai que le temps d'execution est acceptable
Si quelqu'un a une suggestion pour améliorer le script, je suis preneur

Merci pour votre aide à tous
Jean-Pierre
												  



Reply to: