选择要通过名为目录的时间戳输出的目录

时间:2014-11-24 08:03:27

标签: bash

我有一堆根据某个时间戳命名的目录。例如

/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-043720141124-0440

之间的目录输出

ls (logic) >> output.text

3 个答案:

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