it-roy-ru.com

Скрипт BASH: загрузка последовательных пронумерованных файлов с помощью wget

У меня есть веб-сервер, который сохраняет файлы журналов пронумерованных веб-приложений. Пример имени файла для этого будет:

dbsclog01s001.log
dbsclog01s002.log
dbsclog01s003.log

Последние 3 цифры являются счетчиком, и они могут получить до 100.

Я обычно открываю веб-браузер, просматриваю файл как:

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

и сохраните файлы. Это, конечно, немного раздражает, когда вы получаете 50 логов ...

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

но у меня проблемы с моим сценарием. В любом случае, у кого-нибудь есть образец, как это сделать?

спасибо!

40
wonderer
#!/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, дайте ему разрешение на выполнение (chmod +x seq_wget), а затем запустите, например:

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

Или, если у вас есть Bash 4.0, вы можете просто набрать

 $ wget http://someaddress.com/logs/dbsclog01s‹001..050 automotive.log

Или, если у вас есть curl вместо wget, вы можете последовать ответу Денниса Уильямсона.

57
ephemient

curl, кажется, поддерживает диапазоны. Со страницы man:

URL 
 Синтаксис URL зависит от протокола. Вы найдете подробное описание ‐
 в RFC 3986 .

 Вы можете указать несколько URL или частей URL, написав наборы деталей 
 в фигурных скобках, как в: 

 HTTP:. // сайт {один, два, три} .com 

 или вы можете получить последовательности буквенно-цифровых рядов, используя [] как в: 

 ftp://ftp.numericals.com/file[1-100].txt
 ftp://ftp.numerics.com/file[001-100].txt (с ведущими нулями) 
 ftp://ftp.letters.com/file[a-z].txt

 В настоящее время вложенность последовательностей не поддерживается, но вы можете использовать 
 несколько рядом друг с другом: 

 http://any.org/archive[1996-1999]/vol[1-4]/part{a,b,c}.html

 Вы можете указать любое количество URL в командной строке. Они будут
 выбирается последовательно в указанном порядке .

 Начиная с curl 7.15.1 вы также можете указать счетчик шагов для диапазонов, поэтому 
 что вы можете получить каждый N-й номер или букву: 

 http://www.numericals.com/file[1-100:10].txt
 http://www.letters.com/file[a-z:2].txt

Возможно, вы заметили, что он говорит "с ведущими нулями"!

37
Dennis Williamson

Вы можете использовать последовательности типа echo в URL-адресе wget, чтобы загрузить строку чисел ...

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

Это также работает с буквами

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

11
Stephan

Не знаю точно, с какими проблемами вы столкнулись, но похоже, что простой цикл for bash сделает это за вас.

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

Вы можете использовать комбинацию a для цикла 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
11
Mark Rushakoff

Интересное задание, поэтому я написал для вас полный сценарий (объединил несколько ответов и многое другое). Вот:

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

В начале скрипта вы можете установить URL-адрес, префикс файла журнала и суффикс, сколько цифр у вас в части нумерации и каталоге загрузки. Loop загрузит все найденные им лог-файлы и автоматически завершит работу с первым несуществующим файлом (используя тайм-аут wget).

Обратите внимание, что этот сценарий предполагает, что индексация файла журнала начинается с 1, а не с нуля, как вы упомянули в примере.

Надеюсь это поможет.

1
igustin

Поздно, но действительно простое решение, которое не требует кодирования, - это использование дополнения DownThemAll Firefox, которое имеет функциональность для получения диапазонов файлов. Это было мое решение, когда мне нужно было загрузить 800 последовательно пронумерованных файлов. 

0
Kc Daugirdas

Здесь вы можете найти Perl-скрипт, который выглядит так, как вы хотите

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

Проверьте, есть ли в вашей системе 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
0
Hai Vu

Я только что взглянул на обсуждение на странице wget 'globbing':

По умолчанию глобирование будет включено, если URL содержит символ глобинга. Эта опция может быть использована для постоянного включения или выключения глобализации Возможно, вам придется заключить в кавычки URL-адрес, чтобы защитить его от расширения вашей оболочкой. Глобализация заставляет Wget искать список каталогов, который зависит от системы. Вот почему он в настоящее время работает только с Unix FTP-серверами (и теми, которые эмулируют вывод Unix "ls").

Так что wget http: // ... не будет работать с globbing.

0
pavium

Ой! с подобной проблемой я столкнулся при изучении 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

сделанный

0
Doug A.K.