46

番号が付けられた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

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

ありがとう!

4

11 に答える 11

43

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

URL  
       URL構文はプロトコルに依存します。詳細な説明があります-
       RFC3986に記載されています。

       パーツセットを作成することにより、複数の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

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

于 2009-09-15T13:06:15.723 に答える
19

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

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

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

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

于 2016-01-04T18:24:48.707 に答える
14

どのような問題が発生していたのか正確にはわかりませんが、bash の単純な for ループで問題が解決するようです。

for i in {1..999}; do
wget -k http://someaddress.com/logs/dbsclog01s$i.log -O your_local_output_dir_$i;
done
于 2009-09-15T11:15:04.247 に答える
12

for loop in 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
于 2009-09-15T11:15:58.953 に答える
3

興味深いタスクなので、完全なスクリプトを作成しました(いくつかの回答などを組み合わせました)。ここにあります:

#!/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 から始まることを前提としていることに注意してください。

お役に立てれば。

于 2009-09-15T13:07:08.477 に答える
0

ここでは、必要なように見える 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");
}
于 2009-09-15T11:13:49.190 に答える
0

「グロビング」に関する wget マンページの議論を見たところです。

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

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

于 2009-09-15T11:18:50.417 に答える
0

システムに 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
于 2009-09-15T20:14:21.223 に答える
0

おー!これは、漫画のダウンロードを自動化するために 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

終わり

于 2011-01-05T13:10:34.167 に答える