BASH script: Download de arquivos numerados consecutivos com wget
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!
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.