2017-07-29 46 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\+),並沒有別的($是線的末端)的名稱。