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!

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top