在bash中循环使用日期以“2016/201601031400”格式下载文件

时间:2016-12-13 06:20:17

标签: linux bash web-scraping

我是bash和Linux的新手。所以这可能是一个愚蠢的问题。

我正在尝试制作一个bash脚本来从网站下载多个文件。这些文件位于http://example.com/xyz/abc/2016/201601031400.tar.gz

格式的网址中

请注意,文件名包含年,月,日期和时间。该数据贯穿了2007/01/01至2016/12/31的所有日期;时间总是保持不变:“1400”。

我想遍历日期范围中的每个日期,并希望下载所有tar.gz文件。

有人可以帮我解决循环部分并动态生成wget下载文件的URL吗?

3 个答案:

答案 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