Как создать список всех дат в диапазоне с помощью инструментов, доступных в 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.