【问题标题】:How to use ls to list out files that end in numbers如何使用 ls 列出以数字结尾的文件
【发布时间】:2014-02-15 01:44:40
【问题描述】:

我不确定我是否在 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 除外)。我想到的 cmd/regex 是这样的:

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

毫不奇怪,这不起作用。也许我的逻辑不正确,但我想从名为 stream.log 的 cmdline 列表文件中说,末尾有一个可选的 .xyz,其中最后附加了 xyz={1..999}。请让我知道这是否可行,或者我想出的解决方案是否是执行此类操作的唯一方法。提前感谢您的帮助。

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

【问题讨论】:

  • ls *[0-9]|grep -v '-[0-9]{2}$' 或类似的东西。获取所有以数字结尾的文件,然后排除以-digitdigit 结尾的文件
  • @MarcB,感谢您的快速回复。有没有办法得到一个最后没有数字的文件?有一个文件stream.log最后没有数字,但所有其他文件都是stream.log.1,stream.log.nnn。另外,如果您将评论变成答案,我可以投票。
  • Stack Overflow 是一个编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参阅帮助中心的What topics can I ask about here。也许Super User 或Unix & Linux Stack Exchange 会是一个更好的提问地点。

标签: regex linux bash shell ls


【解决方案1】:

您可以通过 中的扩展模式匹配来做到这一点,例如

> 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 替换为更大的数字。虽然我更喜欢 选项而不是这个选项。

【讨论】:

  • Bash 扩展的 glob 仍然不是正则表达式。而且我认为您不需要引用.。
  • @BroSlow,谢谢您的回复。有没有办法让 "'.'+([0-9])" 部分匹配 0 次或更多次?我尝试了您的答案并且它有效,但它遗漏了需要包含在我的 ls 列表中的 stream.log。谢谢。
  • @Classified 查看更新,可以直接使用*(pattern)
  • @BroSlow thx,这就是我需要的。我本来想问你关于数量的问题(比如使用 Perl 类型的量词,即 {0,3}),但我从你上面的“菜单”中弄清楚了。再次感谢。
【解决方案2】:

一种使用sed的方法:

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

还有一个使用egrep:

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

这些打印出以“log”结尾的行,以及可选的句点和任何正数位数,然后是行尾。

【讨论】:

    【解决方案3】:

    只需关注旧日志文件格式中的破折号“-”,您就可以更简单地做到这一点。这是最小版本:

    ls *-*
    

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

    ls stream.log.*-*
    

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

    ls stream.log stream.log.*-*
    

    【讨论】:

      【解决方案4】:

      参考@BroSlow 的回答,这里也包含了 stream.log。

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

      【讨论】:

        猜你喜欢
        • 2022-12-28
        • 2013-09-09
        • 2021-03-20
        • 2014-12-26
        • 1970-01-01
        • 2022-01-20
        • 2013-03-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多