BASH script: Загрузка последовательных нумерованных файлов с помощью wget
У меня есть веб-сервер, который сохраняет файлы журналов в веб-приложении с номером. Пример имени файла для этого:
dbsclog01s001.log
dbsclog01s002.log
dbsclog01s003.log
Последние 3 цифры - это счетчик, и они могут получить до 100.
Обычно я открываю веб-браузер, просматриваю файл как:
http://someaddress.com/logs/dbsclog01s001.log
и сохраните файлы. Это, конечно, немного раздражает, когда вы получаете 50 журналов.
Я попытался придумать BASH script для использования wget и передачи
http://someaddress.com/logs/dbsclog01s*.log
но у меня возникают проблемы с моим script.
В любом случае, у кого-нибудь есть образец того, как это сделать?
спасибо!
Ответы
Ответ 1
#!/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- "[email protected]"
$ ./seq_wget http://someaddress.com/logs/dbsclog01s%03d.log 1 50
Или, если у вас есть Bash 4.0, вы можете просто ввести
$ wget http://someaddress.com/logs/dbsclog01s{001..050}.log
Или, если у вас есть curl
вместо wget
, вы можете следовать за ответом Денниса Уильямсона.
Ответ 2
curl
, похоже, поддерживает диапазоны. На странице 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
Возможно, вы заметили, что он говорит "с ведущими нулями"!
Ответ 3
Вы можете использовать комбинацию для цикла i n bash с printf (конечно, изменяя echo
до wget
по мере необходимости):
$ 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
Ответ 4
Не уверен, какие именно проблемы вы испытывали, но это похоже на простой цикл в bash, который сделает это для вас.
for i in {1..999}; do
wget -k http://someaddress.com/logs/dbsclog01s$i.log -O your_local_output_dir_$i;
done
Ответ 5
Вы можете использовать последовательности эхо-типа в URL-адресе wget для загрузки строки чисел...
wget http://someaddress.com/logs/dbsclog01s00{1..3}.log
Это также работает с буквами
{a..z} {A..Z}
Ответ 6
Интересная задача, поэтому я написал для вас полный script (в сочетании несколько ответов и многое другое). Вот он:
#!/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 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
При запуске script вы можете установить URL, префикс файла журнала и суффикс, сколько цифр у вас есть в нумерации и каталоге загрузки. Loop загрузит все найденные логфайлы и автоматически выйдет из первого несуществующего (используя тайм-аут wget).
Обратите внимание, что этот script предполагает, что индексация файла журнала начинается с 1, а не нуля, как вы упомянули в примере.
Надеюсь, что это поможет.
Ответ 7
Поздняя вечеринка, но очень простое решение, которое не требует кодирования, - использовать надстройку DownThemAll Firefox, которая имеет функции для извлечения диапазонов файлов. Это было мое решение, когда мне нужно было скачать 800 последовательно пронумерованных файлов.
Ответ 8
Здесь вы можете найти Perl script, который выглядит так, как вы хотите
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");
}
Ответ 9
Я просто посмотрел на обсуждение wget manpage "globbing":
По умолчанию включение будет включено, если URL-адрес содержит символ подстановки. Эта опция может использоваться для включения или выключения подстановки.
Возможно, вам придется указать URL-адрес, чтобы защитить его от расширения вашей оболочки. Globbing заставляет Wget искать список каталогов, который является системным. Вот почему он в настоящее время работает только с FTP-серверами Unix (и теми, которые имитируют вывод Unix "ls" ).
Итак, wget http://... не будет работать с globbing.
Ответ 10
Проверьте, есть ли у вашей системы seq, тогда это будет легко:
for i in $(seq -f "%03g" 1 10); do wget "http://.../dbsclog${i}.log"; done
Если ваша система имеет команду jot вместо seq:
for i in $(jot -w "http://.../dbsclog%03d.log" 10); do wget $i; done
Ответ 11
О! это аналогичная проблема, с которой я столкнулся при изучении bash для автоматизации загрузки манги.
Что-то вроде этого должно работать:
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
сделать