' LS' Bash中的命令 - 匹配数字

时间:2017-07-29 19:02:51

标签: linux bash ls

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

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个数字。

4 个答案:

答案 0 :(得分:5)

shopt -s extglob
ls root.type2.c.pa+([0-9])

答案 1 :(得分:0)

使用grep和正则表达式:

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

答案 2 :(得分:0)

试试这个:

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

答案 3 :(得分:0)

当命令行包含shell通配符(*?[...])时,ls列出的文件名列表不会由{{1}决定}。 shell扩展通配符并将ls匹配的文件名列表传递给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\+)的名称,而不保留任何其他内容({{1} }}是行的结尾)。