Home / Indice sezione
 www.icosaedro.it 

 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

Introduzione

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.

Configurazione

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?

Suggerimenti

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

Funzionamento

Questa parte è riservata a chi vuole sapere come funziona.

Perchè bash?

Perchè l'autore non conosceva a sufficienza il C o il C++ per intraprendere tale strada.

Cosa fa?

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\)

Download

scriptpereliminaremessaggi.txt (2,2 KB)

Autore

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.

Umberto Salsi
Commenti
Contatto
Mappa
Home / Indice sezione
Still no comments to this page. Use the Comments link above to add your contribute.