【问题标题】:'ls' command in Bash - Matching numericalsBash 中的“ls”命令 - 匹配数字
【发布时间】:2017-07-29 19:02:51
【问题描述】:

我有一个包含以下文件的目录:

root.o
root.type1
root.type2
root.type1.c
root.type2.c
root.type1.c.pa0
root.type2.c.pa0
root.type2.c.pa1
root.type2.c.pa2
root.type2.c.pa3
....
root.type2.c.pa100
root.type2.c.pa0.out
root.type2.c.pa1.out
root.type2.c.pa2.out
root.type2.c.pa3.out
...
root.type2.c.pa100.out

我想列出以root.type2.c.pa. 开头并以数字结尾的文件,不包括以.out 结尾的文件。换句话说,我想列出这个块:

root.type2.c.pa0
root.type2.c.pa1
root.type2.c.pa2
root.type2.c.pa3
....
root.type2.c.pa100

编写ls root.type2.c.pa?ls root.type2.c.pa??ls root.type2.c.pa??? 就可以了。

他们是在不知道所需文件末尾有多少数字的情况下列出块的简单方法吗?在上面的示例中,我们最多有 3 个数字。实际上,我可能有 1、2、3、4 或 5 个数字。

【问题讨论】:

    标签: linux bash ls


    【解决方案1】:
    shopt -s extglob
    ls root.type2.c.pa+([0-9])
    
    【解决方案2】:

    试试这个:

    ls -1 | grep -oP "root.type2.c.pa\d{1,}"
    

    【讨论】:

    • 这也与文件something.root.type2.c.pa01 匹配,如果您使用管道ls,则不需要-1,并且无论如何也不应该解析ls 的输出。
    【解决方案3】:

    使用 grep 和正则表达式:

    ls |grep -P "root.type2.c.pa[0-9]+$"
    

    【讨论】:

    • 这也匹配 blah.root.type2.c.pa01 之类的文件,并为名称中带有换行符的文件换行。
    【解决方案4】:

    当命令行包含 shell 通配符(*?[...])时,ls 列出的文件名列表不是由ls 决定的。 shell 扩展通配符并将匹配的文件名列表传递给lsls 仅显示带有或不带有其他详细信息(大小、所有者、权限、日期等)的文件名。

    一种可能的解决方案是使用通配符为ls 编写一个命令行,其中包括所有必需的文件(可能还有其他文件),然后将输出通过管道传输到grep 并使用它来仅过滤所需的文件:

    ls -1 root.type2.c.pa* | grep '^root\.type2\.c\.pa\d\+$'
    

    它是如何工作的:

    • ls -1 root.type2.c.pa* - 列出所有名称以root.type2.c.pa 开头的文件; -1 告诉 ls 将每个文件名显示在单独的行上;
    • grep '^root\.type2\.c\.pa\d\+$' 过滤ls 的输出,只保留以root.type2.c.pa 开头的名称,后跟至少一位数字(\d\+),没有其他内容($ 是行尾)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-08
      • 2016-06-18
      • 1970-01-01
      • 1970-01-01
      • 2017-02-23
      • 2016-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多