Как создать список всех дат в диапазоне с помощью инструментов, доступных в bash?

Я хочу загрузить кучу файлов с именами с датами ISO-8601. Есть ли простой способ сделать это с помощью bash+GNU coreutils? (Или какой-то трюк, чтобы сделать wget/curl для автоматического создания списка, но я нахожу это маловероятным)

похоже на этот вопрос, но не ограничивается буднями:как создать спектр nonweekend даты с помощью инструментов, доступных в bash?. Я думаю, что есть более простой способ сделать это без такого ограничения.

также связанных с к как генерировать диапазон дат для случайных данных на bash, но не ограничивается одним годом.

4 ответов


вот два способа, которыми вы могли бы это сделать. Оба они требуют GNU date.

вы могли бы использовать for петли:

for i in {1..5}; do echo $(date -I -d "2014-06-15 +$i days"); done
2014-06-16
2014-06-17
2014-06-18
2014-06-19
2014-06-20

кроме того, вы можете использовать until петли:

d="2014-06-29"
until [[ $d > "2014-07-03" ]]; do 
    echo "$d"
    d=$(date -I -d "$d + 1 day")
done

выход:

2014-06-29
2014-06-30
2014-07-01
2014-07-02
2014-07-03

для более портативного способа сделать то же самое вы можете использовать скрипт Perl:

use strict;
use warnings;
use Time::Piece;
use Time::Seconds;    
use File::Fetch;

my ($t, $end) = map { Time::Piece->strptime($_, "%Y-%m-%d") } @ARGV; 

while ($t <= $end) {
    my $url = "http://www.example.com/" . $t->strftime("%F") . ".log";
    my $ff = File::Fetch->new( uri => $url );
    my $where = $ff->fetch( to => '.' );  # download to current directory
    $t += ONE_DAY;
}

Time::Piece, Time::Seconds и File:: Fetch-все основные модули. Используйте его как perl wget.pl 2014-06-29 2014-07-03.


использование GNU date:

start=2014-12-29
end=2015-01-03
while ! [[ $start > $end ]]; do
    echo $start
    start=$(date -d "$start + 1 day" +%F)
done
2014-12-29
2014-12-30
2014-12-31
2015-01-01
2015-01-02
2015-01-03

вот как я это сделал:

d=$(date -I);
while wget "http://www.example.com/$d.log"; do
    d=$(date -I -d "$d - 1 day");
done

это пытается загрузить все файлы с сегодняшней даты, пока мы не получим 404.


Я использую эту удобную функцию для работы с файлами журналов в формате yyyymmdd.бревно.gz:

function datelist { for dt in $(seq -w  ) ; do date -d $dt +'%Y%m%d' 2>/dev/null ; done ; } 

Он принимает даты в формате yyyymmdd.