tt - Script per eliminare i messaggi
Massimiliano Vessi ha prodotto un programma di utilità che
rimuove dai newsgroup indicati i messaggi più vecchi, coprendo una
delle (tante) mancanze di tt. Si tratta di uno script Bash facilmente
configurabile e che viene qui descritto nei dettagli. Lascio a lui la
parola e lo ringrazio per il contributo. [U.S.]
Indice
Quante volte ci succede, utilizzando tt come newsreader,
di ritrovarci con un newsgroup strapieno di messaggi? Tante,
e per scorrerli tutti ci impiegamo troppo tempo, anche per cancellarli non
risulta pratico cancellarli uno ad uno. Per queste esigenze ho scritto questo
piccolo script in bash, che basta lanciarlo e cancella tutti i messaggi, letti o
no, più vecchi di una certa data, per esempio 15 giorni.
Lo script può essere messo ovunque e può essere rinominato con qualunque nome, se non dovesse partire
ricordarsi di renderlo eseguibile con (immaginando che si chiami "scriptpereliminaremessaggi":
chmod u+x scriptpereliminaremessaggi
Poi con un editor di testo lo aprite e modificate inserendo (in qualunque ordine)
i newsgroup da controllare per eliminare i messaggi vecchi, e il numero di giorni dopo il quale un messaggio è da considerarsi
vecchio. I campi sono già riempiti con alcune voci per far vedere come dovrebbe essere scritto.
Esempio:
##################
#Inserimento dati#
##################
#####################################
#immettere il percorso dei newsgroup
listanewsgroup="alt.os.linux
alt.os.linux.suse
free.it.linux
free.it.linux.suse
it.comp.os.linux.annunci
it.comp.os.linux.iniziare
it.comp.os.linux.sys
italia.jesi.linux
"
######################################################
# Immettere quanti giorni conservare a partire da oggi
# di default è 15
data=15
#######################
#Fine inserimento dati#
#######################
Semplice, no?
Potete addirittura fare tante copie di questo script se volete eliminare i messaggi
di alcuni newsgroup dopo 15 giorni e altri dopo 30. E poi scrivere uno script
in questo modo, così li lanciate tutti in una volta sola:
#! /bin/bash
script1
script2
script3
Questa parte è riservata a chi vuole sapere come funziona.
Perchè l'autore non conosceva a sufficienza il C o il C++ per intraprendere tale
strada.
Inizialmente raccoglie i dati fondamentali in listanewsgroup
e data
.
listanewsgroup
- contiene i nomi dei newsgroup, che devono essere messi uno di seguito all'altro come nell'esempio già mostrato.
data
- contiene un numero che rappresenta i giorni dopo i quali i messaggi sono da considerarsi vecchi e quindi da eliminare.
Poi si sposta nella cartella che contiene i file dei newsgroup, partendo da qualsiasi posizione, con il comando:
cd ~/.tt/inbox
E calcola la data con i seguenti comandi:
giorno=`date -d "$data days ago" '+%d' `
mese=`date -d "$data days ago" '+%b' `
anno=`date -d "$data days ago" '+%Y' `
Sfortunatamente su un computer con la lingua impostata come italiano, la data esce in italiano,
ed è un problema per i mesi. Quindi per trasformarla in inglese ci sono le seguenti righe di codice:
case $mese in
gen)
mese=Jan ;;
feb)
mese=Feb ;;
mar)
mese=Mar ;;
apr)
mese=Apr ;;
mag)
mese=May ;;
giu)
mese=Jun ;;
lug)
mese=Jul ;;
ago)
mese=Aug ;;
set)
mese=Sep ;;
ott)
mese=Oct ;;
nov)
mese=Nov ;;
dic)
mese=Dec ;;
esac
A questo punto grazie ad un ciclo for, che esegue gli stessi comandi per
ogni voce in listanewsgroup, cominciano i comando veri e propri per eliminare i messaggi.
Prima di tutto con un if si controlla che il newsgroup in listanewsgroup esista,
altrimenti apparirà un messaggio che dice "$newsgroup non trovato", così:
if test -f $newsgroup ;
then
...
else
echo $newsgroup non trovato
fi
Poi si prosegue all'interno del programma, se il newsgroup esiste, calcolando
tutte le linee di testo del file del newsgroup, inizializzando tale variabile a zero
prima dell'operazione; altrimenti ogni nuovo ciclo la variabile potrebbe contenere un
numero pericoloso:
numlintot=0
numlintot=`grep -c '' $newsgroup`
Calcolo fino a che linea dovrò cancellare (poichè nel file le voci sono messe in ordine cronologico),
utilizzando i comandi grep e cut per prendere solo la parte dell'output di grep che
mi interessa. La riga cercata è "Date: $giorno $mese $anno" che entro 15 righe prima abbia
la parola "Path:" (è molto difficile che sia contenuta all'interno del testo di un messaggio, è sempre parte dell'intestazione
del messaggio):
numlin=0
numlin=`grep -n -B 15 'Date:' $newsgroup | grep -B 15 -m 1 "$giorno $mese $anno" |grep "Path:"|cut -d - -f1`
Poi si controlla che numlim sia maggiore di 1, perchè altrimenti non c'è da far nulla e apparirà
"$newsgroup già aggiornato":
if [ $numlin > 1 ];
then
...
else
echo $newsgroup è già aggiornato
fi
A questo punto bisogna calcolare quante righe tenere (n) per poi utilizzare il
comando tail:
n=0
n=`expr $numlintot - $numlin`
Si crea un file temporaneo in /tmp/mextemp:
temp=/tmp/mextemp
touch $temp
Adesso si copiano i file da conservare nel file $temp, si contano i messaggi rimasti
sapendo ce ognuno finisce con un punto a inizio riga e basta e quindi si lasciano solo
le ultime righe del flag, il file che memorizza se un file è stato letto o no. Questo si può fare perchè sia il flag che
il file normale hanno i messaggi nello stesso ordine.
Se non capite di cosa stia parlando guardate dentro ~/.tt/inbox/
e leggendo i file capirete:
tail -n $n $newsgroup > $temp
#contiamo i messaggi che sono rimasti
mex=`grep -c '^\.$' $temp`
cat $temp > $newsgroup
#ripuliamo anche il flag
tail -n $mex $newsgroup\ \(flags\) > $temp
cat $temp > $newsgroup\ \(flags\)
scriptpereliminaremessaggi.txt
(2,2 KB)
Chi ha scritto tale script si chiama Massimiliano Vessi, e potete
scrivergli a maxint@despammed.com, per qualunque
motivo. Appeno avrò un pò più di tempo proverò a scriverlo in C++,
cercando di integrarlo meglio con le funzioni scritte dal grande Umberto
Salsi.
Still no comments to this page. Use the Comments link above to add your contribute.