Pergunta

Eu tenho um servidor web que salva os arquivos de log de uma aplicação web contados. Um exemplo de nome de arquivo para este seria:

dbsclog01s001.log
dbsclog01s002.log
dbsclog01s003.log

Os últimos 3 dígitos são o balcão e eles podem obter algum até 100.

Eu costumo abrir um navegador web, navegue até o arquivo como:

http://someaddress.com/logs/dbsclog01s001.log

e salvar os arquivos. Isto, obviamente, fica um pouco irritante quando você ganha 50 logs. Eu tentei chegar a um script para usar wget e passando

http://someaddress.com/logs/dbsclog01s*.log

mas estou tendo problemas com meu script. Enfim, alguém tem um exemplo sobre como fazer isso?

Obrigado!

Foi útil?

Solução

#!/bin/sh

if [ $# -lt 3 ]; then
        echo "Usage: $0 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- "$@"

Salvar o acima como seq_wget, dar-lhe permissão de execução (chmod +x seq_wget), e depois executar, por exemplo:

$ ./seq_wget http://someaddress.com/logs/dbsclog01s%03d.log 1 50

Ou, se você tem Bash 4.0, você poderia simplesmente digitar

$ wget http://someaddress.com/logs/dbsclog01s{001..050}.log

Ou, se você tem curl vez de wget, você poderia seguir a resposta de Dennis Williamson.

Outras dicas

curl parece faixas de apoio. A partir da página 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

Você pode ter notado que ele diz que "com zeros à esquerda"!

Você pode usar eco sequências de tipo na url wget para baixar uma série de números ...

wget http://someaddress.com/logs/dbsclog01s00{1..3}.log

Isso também funciona com letras

{a..z} {A..Z}

Você pode usar uma combinação de um loop for i n festa com printf comando (claro modificando echo para wget conforme necessário):

$ 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

Não tenho certeza exatamente o que problemas que estavam enfrentando, mas parece que um simples loop for em bash iria fazer isso por você.

for i in {1..999}; do
wget -k http://someaddress.com/logs/dbsclog01s$i.log -O your_local_output_dir_$i;
done

tarefa interessante, então eu escrevi roteiro completo para você (combinadas várias respostas e muito mais). Aqui está:

#!/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

No beggiing do script que você pode definir URL, arquivo de log prefixo e sufixo, quantos dígitos você tem em numeração parte e diretório de download. Ciclo irá baixar todos os arquivos de log que foram encontrados, e sair de forma automática no primeiro inexistente (usando tempo limite de wget).

Note que este script assume que começa logfile indexação com 1, não zero, como você mencionou no exemplo.

Espero que isso ajude.

Aqui você pode encontrar um script Perl que se parece com o que você quer

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");
}

Eu só tinha um olhar para a discussão wget manpage de 'englobamento':

Por padrão, o englobamento será ativado se o URL contém um caractere globbing. Esta opção pode ser usada para transformar englobamento ligado ou desligado permanentemente. Você pode ter que citar o URL para protegê-lo de ser expandida pelo shell. Englobamento marcas wget procurar uma listagem de diretório, que é específico do sistema. É por isso que atualmente funciona apenas com servidores Unix FTP (e os emulando "ls" Unix saída).

Assim wget http:. // ... não vai funcionar com englobamento

Verifique se o seu sistema tem seq, então seria fácil:

for i in $(seq -f "%03g" 1 10); do wget "http://.../dbsclog${i}.log"; done

Se o seu sistema tem o comando jota vez de seq:

for i in $(jot -w "http://.../dbsclog%03d.log" 10); do wget $i; done

Oh! este é um problema semelhante Corri para quando aprender bash para automatizar transferências manga.

Algo como isto deve funcionar:

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

feito

atrasado para a festa, mas uma solução fácil real que não requer codificação é usar o DownThemAll Firefox add-on, que tem a funcionalidade para recuperar conjuntos de ficheiros. Essa foi a minha solução quando eu precisava para baixar 800 arquivos numeradas consecutivamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top