2017-07-29 49 views
0

我有以下文件的目录:“LS”在bash命令 - 匹配numericals

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
shopt -s extglob 
ls root.type2.c.pa+([0-9]) 
+0

https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html – Anubis

0

使用grep和正则表达式:

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

这也符合文件,如'blah.root.type2.c.pa01'和减免带有换行符的文件。 –

0

试试这个:

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

这也与'something.root.type2.c.pa01'文件相匹配,如果你用'ls'管道,你不需要'-1',而且你也不应该解析'ls'的输出。 –

0

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

一种可能的解决方案是使用通配符来构成一个命令行用于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\+),并没有别的($是线的末端)的名称。