2014-11-24 87 views
2

我有一堆根据某个时间戳命名的目录。例如选择通过时间戳命名目录输出的目录

/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

回答

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 – anubhava 2014-11-24 14:45:22

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 
+0

我可以知道downvote的原因吗? – anubhava 2014-11-24 09:46:55

+0

downvote不是从我。我没有彻底检查你的脚本,但现在我看到那里有一个错误。无论如何,我认为使用'awk'解决这个问题是个好主意。 ------你正在使用的操作符“+”正在执行一个简单的算术加法,但是操作数并不代表相同的事物(它们的量级不同)。 ------解决问题的一种可能是调整幅度:“10000 * $ 2 + $ 3”。另一种可能性较小的是使用字符串连接而不是算术加法:'$ 1 $ 2'。 – pabouk 2014-11-24 11:55:30

+0

@pabouk:为什么'+'也在工作(并且还显示了输出),因为日期写为'yyyymmdd_hhmm',所以总和基本上是例如'20141124 + 0440',并与'20141124-0440'进行比较,用'+'替换'-',成为'20141124 + 0440'。 – anubhava 2014-11-24 13:43:22

0

当然,括号扩展是你的朋友:

ls d_20141123_0{437..440} >> output.text 

大括号扩展通过提供{start..end}之间的数字序列工作。因此,您可以通过用大括号扩展替换您感兴趣的数字序列来形成所需的任何文件名匹配。在你的情况d_20141123_0{start..end}

+2

这与Liondancer要求的不一样吗?无论文件/目录是否存在,Brace扩展都会生成一个字符串列表。 ------你可以使用类似'[d] _20141123_0 {start..end}的东西',但在'bash'中你必须启用'shopt -s nullglob'。不幸的是,这不会很便携。 – pabouk 2014-11-24 09:02:39

+0

我的朋友,和其他任务一样,有不止一种方式来给这只猫蒙皮。选择一个适合你的喜好。这个问题被标记为** bash **,这是** bash **中旨在做的**括号扩展**。从** bash **到** bash **的可调性不存在问题。 – 2014-11-24 09:13:49

+1

我不认为我们彼此认识。 ---你跳过了我评论前两句的主要观点。便携性只是一个附加的小注,几乎隐藏在末尾:) – pabouk 2014-11-24 09:18:15