web-dev-qa-db-ja.com

BASHスクリプト:連続した番号付きファイルをwgetでダウンロードする

番号付きのWebアプリケーションのログファイルを保存するWebサーバーがあります。これのファイル名の例は次のとおりです。

dbsclog01s001.log
dbsclog01s002.log
dbsclog01s003.log

最後の3桁はカウンタであり、最大100まで取得できます。

私は通常、Webブラウザーを開き、次のようなファイルを参照します。

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

ファイルを保存します。もちろん、50個のログを取得すると、少し面倒です。 wgetを使用して渡すためのBASHスクリプトを思いついた

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

しかし、スクリプトに問題があります。とにかく、これを行う方法のサンプルはありますか?

ありがとう!

44
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- "$@"

上記を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がある場合は、Dennis Williamsonの答えに従うことができます。

61
ephemient

curlは範囲をサポートしているようです。 manページから:

URL 
 URL構文はプロトコルに依存します。詳細な説明は、RFC 3986に記載されています。
 
複数のURLまたはURLの一部を指定するには、次のように中括弧内にパーツセット
を記述します。 :
 
 http:// site。{one、two、three} .com 
 
または[]を使用して英数字シリーズのシーケンスを取得できます:
 
 ftp://ftp.numericals.com/file[1-100].txt
 ftp://ftp.numericals.com/file[001-100] .txt(先行ゼロ付き)
 ftp://ftp.letters.com/file[az].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[az:2].txt

「先行ゼロ付き」と表示されていることに気付いたかもしれません!

38

Wget URLでエコータイプシーケンスを使用して、数字の文字列をダウンロードできます...

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

これは文字でも機能します

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

12
Stephan

どのような問題が発生しているか正確にはわかりませんが、bashの単純なforループがあなたのためにそれを行うように思えます。

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 for loop i n bashと printf コマンドの組み合わせを使用できます(もちろん、必要に応じてechowgetに変更します) :

$ 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、ログファイルのプレフィックスとサフィックス、ナンバリングパーツとダウンロードディレクトリの桁数を設定できます。ループは、見つかったすべてのログファイルをダウンロードし、最初に存在しないときに自動的に終了します(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

システムにseqの代わりにjotコマンドがある場合:

for i in $(jot -w "http://.../dbsclog%03d.log" 10); do wget $i; done
0
Hai Vu

「globing」に関するwgetのマンページの議論を見てみました。

デフォルトでは、URLにグロビング文字が含まれている場合、グロビングがオンになります。このオプションは、グロビングを永続的にオンまたはオフにするために使用できます。シェルによって展開されないようにURLを引用する必要がある場合があります。 Globbingは、Wgetがシステム固有のディレクトリリストを検索するようにします。 これが現在Unix FTPサーバーでのみ動作する理由です(およびUnix "ls"出力をエミュレートするもの)。

したがって、wget http:// ...はグロビングでは機能しません。

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.