Newsgroup: it.comp.os.linux.sys
Titolo: rfc downloading

Un po' per esercizio (sto studiando questo bellissimo libro
http://www.amazon.com/Classic-Shell-Scripting-Arnold-Robbins/dp/0596005954
)
e un po' per necessità ho scritto questa funzioncina per scaricare
tutti gli rfc
function update_rfc() {
	set -x
	OLD=$PWD
	RFC_DIR="$HOME/howto_guide/rfc/"
	INDEX_FILE="1rfc_index.txt"
	INDEX="
http://www.ietf.org/iesg/$INDEX_FILE
"
	SITE="
http://www.ietf.org/rfc
"
	if [ ! -d "$RFC_DIR" ]
		then mkdir "$RFC_DIR" || return
	fi
	cd "$RFC_DIR"
	wget $INDEX
	# get the last value
	LAST=$(tail -n 3 $INDEX_FILE | awk -F' ' '{print $1}' | sed 1q)
	CURR=$LAST
	echo "last value is $CURR"
	while [ ! -f "rfc$CURR.txt" ]
	do
		echo "downloading rfc number $CURR"
		wget "$SITE/rfc$CURR.txt"
		CURR=$(($CURR-1))
		if [ $CURR -lt "1000" ]
			then CURR="0$CURR"
		elif [ $CURR -lt "100" ]
			then CURR="00$CURR"
		elif [ $CURR -lt "10" ]
			then CURR="000$CURR"
		fi
	done
	cd $OLD
	# generate the values
}
In pratica piglia l'ultimo rfc aggiunto e va a ritroso fino a che vede
che il file non esiste già, presumendo che i precedenti siano già
stati quindi scaricati, e assumendo che vengano aggiunti da IETF con
numeri maggiori.
Il problema è che arrivando a 0999 si incarta
-bash: 0999: value too great for base (error token is "0999")
Come mai secondo voi?
E soprattutto ci sono modi più intelligenti di fargli scrivere 20 (ad
esempio) come "0020"?
Altri modi per fare lo stesso lavoro? Wget ricorsivo non mi pare
funzionare..

 -bash: 0999: value too great for base (error token is "0999")
Perché un numero che inizia con 0 è considerato ottale.
Non manipolare CURR ma fai il padding usando printf sulla wget
wget "$SITE/rfc$(printf '%04d' $CURR).txt"
-- 
Flavio Visentin
Scientists have finally discovered what's wrong with the female brain:
On the left side, there is nothing right, and on the right side, there
is nothing left.

Restando con lo stesso stile e lo stesso principio (parto dal fondo e mi
fermo quando trovo un file). Se invece vuoi controllare di averle tutte
sostituisci al break un continue.
function update_rfc() {
    RFC_DIR="$HOME/howto_guide/rfc/"
    INDEX_FILE="1rfc_index.txt"
    INDEX="
http://www.ietf.org/iesg/$INDEX_FILE
"
    SITE="
http://www.ietf.org/rfc/
"
    [ -d "$RFC_DIR" ] || mkdir "$RFC_DIR" || return
    cd "$RFC_DIR"
    wget -O - "$INDEX" | grep -E "^[0-9]{4} " | tac | while read NUM x
    do
        [ -f "rfc$CURR.txt" ] && break
        echo "downloading rfc number $CURR"
        wget "$SITE/rfc$NUM.txt"
    done
    cd -


Ottimo, interessante il printf (in effetti l'avevo pure letto), il tac
vedo che c'è su ubuntu ma non su osx, vabbeh poco male..
ho modificato un po' partendo da 0 (più sensato)
function update_rfc() {
	# trapping exit signals
	# trap "echo \"exiting previously\" && cd - && return" SIGINT SIGTERM
	RFC_DIR="$HOME/howto_guide/rfc/"
	INDEX_FILE="1rfc_index.txt"
	INDEX="
http://www.ietf.org/iesg/$INDEX_FILE
"
	SITE="
http://www.ietf.org/rfc
"
	[ -d "$RFC_DIR" ] ||  mkdir "$RFC_DIR" || return
	cd "$RFC_DIR"
	if [ ! -f $INDEX_FILE ]
		then wget $INDEX
	fi
	# get the last value
	LAST=$(tail -n 3 $INDEX_FILE | awk -F' ' '{print $1}' | sed 1q)
	COUNT=0
	echo "last value is $LAST"
	while [ "$COUNT" -lt "$LAST" ]
	do
		FNAME="rfc$(printf '%04d' $COUNT).txt"
		[ -f $FNAME ] && break
		# otherwise just try download it
		echo "downloading rfc number $FNAME"
		wget "$SITE/$FNAME" || echo "rfc $COUNT not present" 1>&2
		COUNT=$(($COUNT+1))
	done
}
Sarebbe meglio andare a scaricare solo i presenti in effetti, però non
mi riesce bene a tirar fuori tutti i numeri da quel listone...

function update_rfc() {
	# trapping exit signals
	# trap "echo \"exiting previously\" && cd - && return" SIGINT SIGTERM
	RFC_DIR="$HOME/howto_guide/rfc/"
	INDEX_FILE="1rfc_index.txt"
	INDEX="
http://www.ietf.org/iesg/$INDEX_FILE
"
	SITE="
http://www.ietf.org/rfc
"
	[ -d "$RFC_DIR" ] ||  mkdir "$RFC_DIR" || return
	cd "$RFC_DIR"
	[ -f $INDEX_FILE ] || wget $INDEX || (echo "error can't get the
index" 1>&2 && exit 2)
	grep -E '^[0-9]{4}' $INDEX_FILE | awk -F ' ' '{print $1}' | while
read NUM
	do
		FNAME="rfc$NUM.txt"
		[ -f $FNAME ] && continue
		# otherwise just try download it
		echo "downloading rfc number $FNAME"
		wget "$SITE/$FNAME" > /dev/null || echo "rfc $NUM not downloaded"
1>&2
	done
}
Ok adesso direi che ci siamo, ho scoperto che non tutti gli rfc
dell'indice sono comunque scaricabili, per alcuni non si ha il
permesso... Non è grave naturalmente.
Così scorre tutto, tanto non ho mica fretta lasciamolo pure lavorare
(se già ci sono ci mette un attimo comunque)!

 read NUM
L'awk è superfluo.
grep -E '^[0-9]{4} ' $INDEX_FILE | while read NUM X
"read NUM X" mette il primo campo in NUM e tutto il resto in X, quindi fa
già quel che ti serve. Inoltre awk non è detto ci sia su un sistema.
