Скрипт BASH: загрузка последовательных пронумерованных файлов с помощью wget - PullRequest
44 голосов
/ 15 сентября 2009

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

dbsclog01s001.log
dbsclog01s002.log
dbsclog01s003.log

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

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

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

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

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

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

спасибо!

Ответы [ 11 ]

60 голосов
/ 15 сентября 2009
#!/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- "$@"

Сохраните вышеуказанное как 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}.log

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

38 голосов
/ 15 сентября 2009

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

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

12 голосов
/ 04 января 2016

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

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

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

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

11 голосов
/ 15 сентября 2009

Вы можете использовать комбинацию 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 голосов
/ 15 сентября 2009

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

for i in {1..999}; do
wget -k http://someaddress.com/logs/dbsclog01s$i.log -O your_local_output_dir_$i;
done
1 голос
/ 15 сентября 2009

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

#!/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, а не с нуля, как вы упомянули в примере.

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

0 голосов
/ 28 апреля 2017

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

0 голосов
/ 05 января 2011

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

Проверьте, есть ли в вашей системе 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 голосов
/ 15 сентября 2009

Я только что посмотрел обсуждение на странице wget 'globbing':

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

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

...