Script BASH: download di file numerati consecutivi con wget
Domanda
Ho un server web che salva i file di log di un'applicazione web numerata. Un esempio di nome file per questo sarebbe:
dbsclog01s001.log
dbsclog01s002.log
dbsclog01s003.log
Le ultime 3 cifre sono il contatore e possono arrivare fino a 100.
Di solito apro un browser Web, sfoglio il file come:
http://someaddress.com/logs/dbsclog01s001.log
e salva i file. Questo ovviamente diventa un po 'fastidioso quando si ottengono 50 registri. Ho provato a trovare uno script BASH per usare wget e passare
http://someaddress.com/logs/dbsclog01s*.log
ma sto riscontrando problemi con il mio script. Comunque, qualcuno ha un esempio su come farlo?
grazie!
Soluzione
#!/bin/sh
if [ $# -lt 3 ]; then
echo "Usage: $ ./seq_wget http://someaddress.com/logs/dbsclog01s%03d.log 1 50
url_format seq_start seq_end [wget_args]"
exit
fi
url_format=$1
seq_start=$2
seq_end=$3
shift 3
printf "$url_format\\n" `seq $seq_start $seq_end` | wget -i- "$@"
Salva quanto sopra come seq_wget
, concedi l'autorizzazione all'esecuzione ( chmod + x seq_wget
), quindi esegui, ad esempio:
$ wget http://someaddress.com/logs/dbsclog01s{001..050}.log
Oppure, se hai Bash 4.0, puoi semplicemente digitare
<*> Oppure, se hai curl
invece di wget
, potresti seguire la risposta di Dennis Williamson.
Altri suggerimenti
curl
sembra supportare gli intervalli. Dalla pagina man
:
URL The URL syntax is protocol dependent. You’ll find a detailed descrip‐ tion in RFC 3986. You can specify multiple URLs or parts of URLs by writing part sets within braces as in: http://site.{one,two,three}.com or you can get sequences of alphanumeric series by using [] as in: ftp://ftp.numericals.com/file[1-100].txt ftp://ftp.numericals.com/file[001-100].txt (with leading zeros) ftp://ftp.letters.com/file[a-z].txt No nesting of the sequences is supported at the moment, but you can use several ones next to each other: http://any.org/archive[1996-1999]/vol[1-4]/part{a,b,c}.html You can specify any amount of URLs on the command line. They will be fetched in a sequential manner in the specified order. Since curl 7.15.1 you can also specify step counter for the ranges, so that you can get every Nth number or letter: http://www.numericals.com/file[1-100:10].txt http://www.letters.com/file[a-z:2].txt
Potresti aver notato che dice "con zeri iniziali"!
Puoi usare le sequenze di tipi di eco nell'url di wget per scaricare una stringa di numeri ...
wget http://someaddress.com/logs/dbsclog01s00{1..3}.log
Funziona anche con le lettere
{a..z} {A..Z}
Puoi utilizzare una combinazione di a for loop i n bash con il comando printf (ovviamente modificando echo
in wget
secondo necessità):
$ for i in {1..10}; do echo "http://www.com/myurl`printf "%03d" $i`.html"; done
http://www.com/myurl001.html
http://www.com/myurl002.html
http://www.com/myurl003.html
http://www.com/myurl004.html
http://www.com/myurl005.html
http://www.com/myurl006.html
http://www.com/myurl007.html
http://www.com/myurl008.html
http://www.com/myurl009.html
http://www.com/myurl010.html
Non sono sicuro esattamente quali problemi stavi riscontrando, ma sembra che un semplice ciclo in Bash lo farebbe per te.
for i in {1..999}; do
wget -k http://someaddress.com/logs/dbsclog01s$i.log -O your_local_output_dir_$i;
done
Compito interessante, quindi ho scritto uno script completo per te (combinando diverse risposte e altro). Eccolo:
#!/bin/bash
# fixed vars
URL=http://domain.com/logs/ # URL address 'till logfile name
PREF=logprefix # logfile prefix (before number)
POSTF=.log # logfile suffix (after number)
DIGITS=3 # how many digits logfile's number have
DLDIR=~/Downloads # download directory
TOUT=5 # timeout for quit
# code
for((i=1;i<10**$DIGITS;++i))
do
file=$PREF`printf "%0${DIGITS}d" $i`$POSTF # local file name
dl=$URL$file # full URL to download
echo "$dl -> $DLDIR/$file" # monitoring, can be commented
wget -T $TOUT -q $dl -O $file
if [ "$?" -ne 0 ] # test if we finished
then
exit
fi
done
All'inizio dello script è possibile impostare URL, prefisso e suffisso del file di registro, quante cifre sono presenti nella parte di numerazione e nella directory di download. Loop scaricherà tutti i file di log trovati e uscirà automaticamente al primo inesistente (usando il timeout di wget).
Si noti che questo script presuppone che l'indicizzazione del file di registro inizi con 1, non con zero, come menzionato nell'esempio.
Spero che questo aiuti.
Qui puoi trovare uno script Perl che assomiglia a quello che vuoi
http://osix.net/modules/article/?id=677
#!/usr/bin/perl
$program="wget"; #change this to proz if you have it ;-)
my $count=1; #the lesson number starts from 1
my $base_url= "http://www.und.nodak.edu/org/crypto/crypto/lanaki.crypt.class/lessons/lesson";
my $format=".zip"; #the format of the file to download
my $max=24; #the total number of files to download
my $url;
for($count=1;$count<=$max;$count++) {
if($count<10) {
$url=$base_url."0".$count.$format; #insert a '0' and form the URL
}
else {
$url=$base_url.$count.$format; #no need to insert a zero
}
system("$program $url");
}
Ho appena dato un'occhiata alla discussione sulla manpage di "globbing":
Per impostazione predefinita, il globbing verrà attivato se l'URL contiene un carattere globbing. Questa opzione può essere utilizzata per attivare o disattivare il globbing in modo permanente. Potrebbe essere necessario citare l'URL per proteggerlo dall'espansione della shell. Globbing fa cercare a Wget un elenco di directory, che è specifico del sistema. Questo è il motivo per cui attualmente funziona solo con i server FTP Unix (e quelli che emulano l'output di Unix "ls").
Quindi wget http: // ... non funziona con i globbing.
Verifica se il tuo sistema ha seq, quindi sarebbe facile:
for i in $(seq -f "%03g" 1 10); do wget "http://.../dbsclog${i}.log"; done
Se il tuo sistema ha il comando jot invece di seq:
for i in $(jot -w "http://.../dbsclog%03d.log" 10); do wget $i; done
Oh! questo è un problema simile che ho riscontrato quando ho imparato bash per automatizzare i download di manga.
Qualcosa del genere dovrebbe funzionare:
for a in `seq 1 999`; do
if [ ${#a} -eq 1 ]; then
b="00"
elif [ ${#a} -eq 2 ]; then
b="0"
fi
echo "$a of 231"
wget -q http://site.com/path/fileprefix$b$a.jpg
fatto
In ritardo alla festa, ma una soluzione davvero semplice che non richiede codifica è quella di utilizzare il componente aggiuntivo DownThemAll Firefox, che ha la funzionalità per recuperare intervalli di file. Quella era la mia soluzione quando avevo bisogno di scaricare 800 file numerati consecutivamente.