我的脚本必须列出文件名中给定日期范围之间的所有文件(例如:20130133.212001.log)。开始日期和结束日期将由用户给出。我现在有start_year,end_year,start_month,end_month ....所以直到end_second。我的计划是使用ls语法:
ls *{start_year..end_year}{start_month..end_month}{.....}.log
但问题是如果月份或日期有01 bash将其视为1.确实我的bash版本早于4.我不能考虑更新bash版本。 我用来列出此范围内文件的任何其他方法。
[编辑]
$> cat tmp.sh
#! /bin/bash
start_year=2013
end_year=2013
start_month=01
end_month=01
start_date=01
end_date=12
start_month=$(printf %02d $start_month)
end_month=$(printf %02d $end_month)
start_date=$(printf %02d $start_date)
end_date=$(printf %02d $end_date)
ls {$start_year..$end_year}{$start_month..$end_month}{$start_date..$end_date}.log
$>
但输出是:
$>./tmp.sh
ls: {2013..2013}{01..01}{01..12}.log: No such file or directory
而当前目录包含:
$> ls
20130101.log 20130103.log 20130105.log 20130107.log 20130109.log 20130111.log 20130201.log abcd.log
20130102.log 20130104.log 20130106.log 20130108.log 20130110.log 20130112.log 2013.log tmp.sh
$>
答案 0 :(得分:2)
在这种情况下,你可以使用printf
设施。
考虑这个脚本:
for i in {1..2}; do for j in {01..12}; do printf "%02d%02d\n" $i $j; done; done
**更新:使用变量:
start=1
end=2
for ((i=start; i<=end; i++)); do
for ((j=1; j<=12; j++)); do printf "%02d%02d\n" $i $j; done
done
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
答案 1 :(得分:2)
这样怎么样:
start=$start_year$(printf %02d $start_month)
end=$end_year$(printf %02d $end_month)
ls *.log | sed -ne "/$start/,/$end/p"