簡體   English   中英

在bash中循環瀏覽日期以下載“ 2016/201601031400”格式的文件

[英]Looping through dates in bash to download files in “2016/201601031400” format

我對bash和Linux相當陌生。 因此,這可能是一個愚蠢的問題。

我正在嘗試制作一個bash腳本,以從網站下載多個文件。 這些文件位於URL上,格式為http://example.com/xyz/abc/2016/201601031400.tar.gz

請注意,文件名包含年,月,日期和時間。 數據會迭代從2007年1月1日到2016年12月31日的所有日期; 時間始終保持不變:“ 1400”。

我想遍歷日期范圍中的每個日期,並想下載所有tar.gz文件。

有人可以在循環部分為我提供幫助並為wget動態生成URL來下載文件嗎?

如果您不介意花幾秒鍾來調用date幾千次(與網絡往返次數相比,這是微不足道的),則只需在開始時間增加幾天。 使用一個簡單的for循環(請注意您的范圍內有3653天),並使用date適當地格式化每個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

上面,我們對date使用-d參數將天數添加到初始日期,並使用格式參數將日期/時間值插值到字符串中。

為了獲得正確的日期,您需要增加日期:

#!/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

只需將echo替換為直接調用wget。

更好的解決方案

這基於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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM