BASH脚本:使用wget下载连续编号的文件

我有一个Web服务器,保存编号的Web应用程序的日志文件。 一个文件名的例子是:

dbsclog01s001.log dbsclog01s002.log dbsclog01s003.log 

最后3位是计数器,他们可以达到100。

我通常打开一个网页浏览器,浏览到如下文件:

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

并保存这些文件。 当你得到50个日志时,这当然会让人有些恼火。 我试图想出使用wget和传递的BASH脚本

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

但是我的脚本有问题。 无论如何,任何人都有如何做到这一点的样本?

谢谢!

 #!/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 http://someaddress.com/logs/dbsclog01s%03d.log 1 50

或者,如果你有Bash 4.0,你可以input

 $ wget http://someaddress.com/logs/dbsclog01s{001..050}.log

或者,如果你curl而不是wget ,你可以按照Dennis Williamson的回答。

curl似乎支持范围。 从man页:

 url  
        URL语法是依赖于协议的。 你会发现一个详细的描述 - 
       在RFC 3986中。

       您可以通过编写部分集指定多个URL或部分URL
       大括号内,如:

         HTTP:// {网站一个,两个,三个} .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。 他们会
       以指定的顺序依次取出。

       由于curl7.15.1,你也可以指定步长计数器的范围,所以
       你可以得到每一个数字或字母:

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

你可能已经注意到它说“带前导零”!

您可以使用for循环和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 

不知道你遇到了什么问题,但它听起来像一个简单的循环在bash会为你做。

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

您可以使用wget url中的回显types序列下载一串数字…

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

这也适用于字母

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

有趣的任务,所以我写了完整的脚本给你(结合几个答案和更多)。 这里是:

 #!/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,日志文件前缀和后缀,您在编号部分和下载目录中有多less位数字。 循环将下载它find的所有日志文件,并自动退出第一个不存在(使用wget的超时)。

请注意,此脚本假定日志文件索引从1开始,而不是从零开始,如您在示例中所述。

希望这可以帮助。

晚了,但一个真正简单的解决scheme,不需要编码是使用DownThemAll Firefox插件,它具有检索文件范围的function。 当我需要下载800个连续编号的文件时,这是我的解决scheme。

在这里你可以find一个看起来像你想要的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"); } 

我刚才看了一下wget关于“globbing”的manpage讨论:

默认情况下,如果URL包含通配符,则会打开通配符。 此选项可用于永久打开或closures通配符。 您可能需要引用该URL以防止其被shell扩展。 Globbing使Wget寻找一个目录列表,这是系统特定的。 这就是为什么它目前只适用于Unix FTP服务器 (以及那些模拟Unix“ls”输出的服务器)。

所以wget http:// …不会和globbing一起工作。

检查你的系统是否有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 

哦! 这是我在学习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 

DONE