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命令(当然,根据需要修改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
不知道你遇到了什么问题,但它听起来像一个简单的循环在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