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

Вот инструкции, принимающие Вам, хотят установить Cygwin на компьютере без Интернет-соединения. Я предполагаю, что у Вас есть доступ к другому компьютеру с Интернет-соединение. Запустите на подключенном компьютере:

  • Получают программу установки Cygwin ("setup.exe"). Прямой URL загрузки: x86 или x86_64.

  • , Когда установка просит "Выбирать источник загрузки", выбирают Download Without Installing

  • Go через остальную часть установки (выбирают каталог загрузки, зеркала, пакеты программного обеспечения, которые Вы хотите, и т.д.)

  • Теперь у Вас есть репозиторий Cygwin тут же на Вашем жестком диске. Скопируйте этот каталог, наряду с программой "setup.exe", к Вашему целевому компьютеру (это не должно быть в сети).

  • На целевом компьютере, выполненный "setup.exe"

  • , Когда установка просит "Выбирать источник загрузки", выбирают Install From Local Directory

  • Complete установка, как обычно. Никакой доступ в Интернет не требуется.

44
задан wonderer 15 September 2009 в 11:10
поделиться

8 ответов

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

61
ответ дан 26 November 2019 в 21:42
поделиться

Точно не знаю, с какими проблемами вы столкнулись, но похоже, что простой цикл 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
ответ дан 26 November 2019 в 21:42
поделиться

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

Вы могли заметить, что там написано «с ведущими нулями»!

38
ответ дан 26 November 2019 в 21:42
поделиться

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

#!/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
ответ дан 26 November 2019 в 21:42
поделиться

Здесь вы можете найти сценарий 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
ответ дан 26 November 2019 в 21:42
поделиться

Вы можете используйте комбинацию цикла for 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
ответ дан 26 November 2019 в 21:42
поделиться

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

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

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

0
ответ дан 26 November 2019 в 21:42
поделиться

Проверьте, есть ли в вашей системе 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
ответ дан 26 November 2019 в 21:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: