带范围的Bash列表文件

时间:2013-12-15 06:14:15

标签: bash ls

我的脚本必须列出文件名中给定日期范围之间的所有文件(例如: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
$> 

2 个答案:

答案 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"