我有一堆根据某个时间戳命名的目录。例如
/d_20141123_0435
/d_20141123_0436
/d_20141123_0437 <--- start
/d_20141123_0438
/d_20141123_0439
/d_20141123_0440
...
...
...
/d_20141124_0438
/d_20141124_0439
/d_20141124_0440 <-- end
我想知道是否有一个bash命令只输出我想要的某些日期。例如,如果我只想要20141123-0437
到20141124-0440
ls (logic) >> output.text
答案 0 :(得分:2)
ls
命令没有这样的功能,但您可以使用简单的脚本。不应解析ls
的输出,但如果您确实要使用它,请将*
替换为$(ls)
。
如果不包括边界:
after=d_20141123_0437
before=d_20141124_0440
for a in * ; do
if test "$a" \> "$after" && test "$a" \< "$before" ; then
echo "$a"
fi
done >> output.text
如果应该包括它们:
after=d_20141123_0437
before=d_20141124_0440
for a in * ; do
if { test "$a" \> "$after" && test "$a" \< "$before" ; } ||
test "$a" = "$after" || test "$a" = "$before" ; then
echo "$a"
fi
done >> output.text
如果在命令;
之后替换换行符,则两个脚本都可以在一行上。
答案 1 :(得分:1)
假设这些目录在如图所示的文件中,您可以使用此awk:
awk -F_ -v s1='20141123-0437' -v s2='20141124-0440' 'BEGIN{
split(s1, a, "-");
split(s2, b, "-");
start = a[1]a[2];
end = b[1]b[2];
}
int($2$3) >= start && int($2$3) <= end' file
/d_20141123_0437 <--- start
/d_20141123_0438
/d_20141123_0439
/d_20141123_0440
/d_20141124_0438
/d_20141124_0439
/d_20141124_0440 <-- end
答案 2 :(得分:0)
当然,支撑扩展是你的朋友:
ls d_20141123_0{437..440} >> output.text
大括号扩展的工作方式是在{start..end}
之间提供一系列数字。因此,您可以使用大括号扩展替换您感兴趣的数字序列,从而形成所需的任何文件名匹配。在您的情况下d_20141123_0{start..end}