我想下载一堆用ISO-8601日期命名的文件.使用bash + GNU coreutils有一种简单的方法吗?(或者让wget/curl自动生成列表的一些技巧,但我发现这不太可能)
与此问题类似,但不限于工作日:如何使用bash中提供的工具生成一系列非周末日期?.我想有一种更简单的方法可以在没有这种限制的情况下做到这一点.
还与如何在bash上生成随机数据的日期范围有关,但不限于一年.
Tom*_*ech 28
如果你有GNU date,你可以在任何符合POSIX的shell中使用for循环:
# with "for"
for i in {1..5}; do
echo $(date -I -d "2014-06-28 +$i days")
done
Run Code Online (Sandbox Code Playgroud)
或until循环,这次使用Bash的扩展测试[[:
# with "until"
d="2014-06-29"
until [[ $d > 2014-07-03 ]]; do
echo "$d"
d=$(date -I -d "$d + 1 day")
done
Run Code Online (Sandbox Code Playgroud)
请注意,sh如果您将条件更改为,则非古代版本也会进行词典比较[ "$d" \> 2014-07-03 ].
这些循环中的任何一个的输出:
2014-06-29
2014-06-30
2014-07-01
2014-07-02
2014-07-03
Run Code Online (Sandbox Code Playgroud)
要以更便携的方式执行相同的操作,您可以使用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;
}
Run Code Online (Sandbox Code Playgroud)
Time :: Piece,Time :: Seconds和File :: Fetch都是核心模块.像它一样使用它perl wget.pl 2014-06-29 2014-07-03.
使用GNU日期和bash:
start=2014-12-29
end=2015-01-03
while ! [[ $start > $end ]]; do
echo $start
start=$(date -d "$start + 1 day" +%F)
done
Run Code Online (Sandbox Code Playgroud)
2014-12-29
2014-12-30
2014-12-31
2015-01-01
2015-01-02
2015-01-03
Run Code Online (Sandbox Code Playgroud)
如果您使用的是 macOS,则其date工作方式与 GNU 略有不同date。下面date是支持 GNU 和 Darwin 的Tom Fenech调用的一个变体:
if [ $(uname) = 'Darwin' ]; then
d=$(date -j -v+1d -f %Y-%m-%d $d +%Y-%m-%d)
elif [ $(uname) = 'Linux' ]; then
d=$(date -I -d "$d + 1 day")
fi
Run Code Online (Sandbox Code Playgroud)