如何使用ls列出以数字结尾的文件



我不确定在bash中是否正确使用了正则表达式。我在一个使用bash-shell的Centos系统上。在我们的日志目录中,有一些附加了数字的日志文件,即

stream.log
stream.log.1
stream.log.2 
...
stream.log.nnn  

不幸的是,还有一些日志文件采用了新的命名约定

stream.log.2014-02-14 
stream.log.2014-02-13

我需要获取具有旧日志文件命名格式的文件。我发现了一些有效的方法,但我想知道是否还有其他更优雅的方法。

ls -v stream.log* | grep -v 2014

我不知道正则表达式在bash中是如何工作的,也不知道输出到哪个命令(可能不是grep)

ls -v stream.log(.d{0,2})+

毫不奇怪,这并没有奏效。也许我的逻辑不正确,但我想从cmdline列表中说,名为stream.log的文件末尾有一个可选的.xyz,其中xyz={1..999}附加在末尾。请让我知道这是否可行,或者我提出的解决方案是否是做这样事情的唯一方法。提前感谢您的帮助。

编辑:感谢大家的及时评论和回复。我只是想提一下,还有一个名为stream.log的文件,它后面没有任何数字,也需要将其添加到我的ls列表中。我尝试了评论和答案中的提示,它们很有效,但它忽略了那个文件

您可以使用bash中的扩展模式匹配来实现这一点,例如

> shopt -s extglob
> ls *'.'+([0-9])

何处

+(pattern-list)
Matches one or more occurrences of the given patterns

以及其他有用的语法。

?(pattern-list)
Matches zero or one occurrence of the given patterns
*(pattern-list)
Matches zero or more occurrences of the given patterns
@(pattern-list)
Matches one of the given patterns
!(pattern-list)
Matches anything except one of the given patterns

或者,如果没有扩展的模式匹配,可以使用不太整洁的解决方案

ls *'.'{1..1000} 2>dev/null

如果你有很多日志文件,可以用更大的数字替换1000。尽管我更喜欢grep选项而不是这个。

一种使用sed:的方法

ls -v stream.log* | sed -nE '/log(.[0-9]+)?$/p'

一个使用egrep:

ls -v stream.log* | egrep 'log(.[0-9]+)?$'

这些打印出以"log"结尾的行,可以选择一个句点和任何正数,后跟行的末尾。

只需关注旧日志文件格式中的短划线'-',就可以实现这一点。这是最低版本:

ls *-*

如果同一目录中有不同类型的日志文件,这可能会更安全:

ls stream.log.*-*

为了确保您获得一个额外的文件,生成一个令人困惑的正则表达式是没有意义的——只需将其包含在ls行中即可:

ls stream.log stream.log.*-*

参考@BroSlow的答案,这里是修复程序,其中也将包括stream.log。

shopt -s extglob
ls stream.log*(.)*([0-9])
stream.log  stream.log.1  stream.log.2

相关内容

  • 没有找到相关文章

最新更新