【问题标题】:bash wildcard n digitsbash 通配符 n 位
【发布时间】:2013-12-20 12:55:51
【问题描述】:

所以我在 tmp 目录中有以下文件:

 file.0
 file.1
 file.t9
 file.22
 file.4444

如果我只想列出以 '.digits' (0, 1, 22, 4444) 而不是 (t9) 结尾的文件,我可以尝试使用如下通配符:

 ls tmp/file.{[0-9],[0-9][0-9],[0-9][0-9][0-9],[0-9][0-9][0-9][0-9]}

但是我得到以下结果并带有丑陋的错误

 ls: cannot access tmp/file.[0-9][0-9][0-9][0-9]: No such file or directory
 file.0
 file.1
 file.22
 file.4444

我也尝试过使用 {0..999},但这也会导致相同类型的错误(以及更多错误)。 任何关于如何在没有专家错误的情况下做到这一点的线索?

【问题讨论】:

标签: linux bash wildcard


【解决方案1】:

另一个防止看到(即隐藏)“丑陋错误”的简单解决方案是通过附加2> /dev/null 将标准错误重定向到/dev/null。在您的示例中:

ls tmp/file.{[0-9],[0-9][0-9],[0-9][0-9][0-9],[0-9][0-9][0-9][0-9]} 2> /dev/null

这将为您提供所需的结果并隐藏任何错误。适用于任何将输出发送到 stdout 并将错误发送到 stderr 的 linux 命令或可执行文件。请注意,这不会影响命令返回状态 ($?),它只是抑制错误。

【讨论】:

    【解决方案2】:

    至少在 bash 4 中,当extglob shell 选项启用时:

    shopt -s extglob
    ls /tmp/file.+([0-9])
    

    那里的模式+([0-9]) 匹配一个或多个数字。

    您可以在man bash模式匹配部分了解更多信息。

    更新

    实际上,正如@chepner 所指出的,自从extglob 是在 2.02 版中引入的,这应该适用于您今天遇到的几乎每个bash,除非您将您的发行版从岩石或其他东西中拉出来。

    【讨论】:

    • 我们不能运行 bash 4,因为我得到“...unexpected token '('”
    • 运行shopt -s extglob后重试!
    • 确实有效 - 是否可作为标准配置?还是我的管理员足够出色,可以包含它?
    • 在我的 Debian 上这是默认的。让我们假设您的管理员足够出色 ;-)
    • extglob 在 2.02 版本中引入。
    【解决方案3】:

    过滤特定扩展名文件的另一种变体是使用带有一组谓词的find 命令:

    find tmp/ -type f -iregex '^.*\.[0-9]+$'
    

    -type 谓词仅匹配文件,-iregex 匹配以一位或多位数字结尾的名称 - 忽略名称的大小写。如果您想过滤以file 开头的文件,您可以使用以下代码:

    find tmp/ -type f -iregex '^.*/file\.[0-9]+$'
    

    最后,如果您不想为每个结果文件显示整个路径,请使用以下命令:

    find tmp/ -type f -iregex '^.*/file\.[0-9]+$' -printf "%f\n"
    

    【讨论】:

      【解决方案4】:

      您可以使用ls 列出所有文件,然后通过grep 过滤输出:

      ls -1 | grep -E '\.[0-9]+$'
      

      根据以下测试:

      pax> printf 'file.0\nfile.1\nfile.t9\nfile.22\nfile.4444\n' | grep -E '\.[0-9]+$'
      file.0
      file.1
      file.22
      file.4444
      

      -E 为您提供扩展的正则表达式,以便 + 修饰符起作用。如果这对您不可用,您可以改用 \.[0-9][0-9]*$ 正则表达式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-28
        • 2018-11-01
        相关资源
        最近更新 更多