我是bash和Linux的新手。所以这可能是一个愚蠢的问题。
我正在尝试制作一个bash脚本来从网站下载多个文件。这些文件位于http://example.com/xyz/abc/2016/201601031400.tar.gz
请注意,文件名包含年,月,日期和时间。该数据贯穿了2007/01/01至2016/12/31的所有日期;时间总是保持不变:“1400”。
我想遍历日期范围中的每个日期,并希望下载所有tar.gz文件。
有人可以帮我解决循环部分并动态生成wget下载文件的URL吗?
答案 0 :(得分:5)
如果您不介意花几秒钟来调用date
几千次(与网络往返次数相比这将是微不足道的),您可以添加几天开始时间。使用简单的for
循环(注意您的范围内有3653天),并使用date
对每个循环进行适当格式化:
#!/bin/bash
start='14:00 2007-01-01'
for i in {0..3652}
do
d=$(date -d "$start +$i days" '+http://example.com/xyz/abc/%Y/%Y%m%d%H%M.tar.gz')
echo "$d" # or wget, or whatever
done
上面,我们使用-d
参数date
来添加初始日期的天数,我们使用format参数将日期/时间值插入到字符串中。< / p>
答案 1 :(得分:2)
要获得正确的日期,您需要增加日期:
#!/usr/bin/env bash
begin_date=2015-01-04
end_date=2015-03-05
d=$begin_date
while [ "$d" != "$end_date" ]; do
year=$( echo $d | cut -f1 -d- )
month=$( echo $d | cut -f2 -d- )
day=$( echo $d | cut -f3 -d- )
echo "wget http://anything/$year/$year$month${day}1400.tar.gz"
d=$(date -I -d "$d + 1 day")
done
直接用调用wget替换echo ..
答案 2 :(得分:1)
更好的解决方案
这是基于Krzysztof Kaszkowiak的回答。但既然我不能评论他的帖子......
#!/usr/bin/env bash
begin_date="2015 01 04"
end_date="2015 03 05"
read year month day < <( echo $begin_date )
while [ "$y $m $d" != "$end_date" ]; do
echo "wget http://anything/$year/$year$month${day}1400.tar.gz"
read year month day < <(date +"%Y %m %d" -d "$year-$month-$day + 1 day")
done
未完成的解决方案
在这里您应该拥有2007/01/01至2016/12/31的所有日期以及2016/02/31之间不存在的日期,因为所有月份的天数从1到31循环。
#!/bin/bash
COMMON_PREFIX="http://foo.com/xyz/abc/"
COMMON_SUFFIX="1400.tar.gz"
for y in $( seq 2007 2016 )
do
for m in $( seq 1 12 )
do
for d in $( seq 1 31 )
do
printf "%s%d/%d%02d%02d%s\n" $COMMON_PREFIX $y $y $m $d $COMMON_SUFFIX
done
done
done