2012-10-19 72 views
6

find命令使用正則表達式目前我使用在多種文件類型

find . -name '*.[cCHh][cC]' -exec grep -nHr "$1" {} ; \ 
find . -name '*.[cCHh]' -exec grep -nHr "$1" {} ; 

來搜索所有文件字符串以.c,.C,.H,.H,.CC和.cc結束列在所有子目錄中。但是由於這包括兩個命令,所以這感覺效率低下。

如何使用單個正則表達式模式來查找.c,.C,.h,.H,.cc和.CC文件?

我在Linux機器上使用bash。

+2

順便說一下,'-name'的參數不是一個正則表達式,它是一個shell擴展。 – rid

回答

14

您可以使用布爾或參數:

find -name '*.[ch]' -o -name '*.[CH]' -o -name '*.cc' -o -name '*.CC' 

上述發現,在結尾的文件:

  • .c.h
  • .C.H
  • .cc
  • .CC
+3

比試圖用正則表達式完成更優雅。 –

+0

如果你想添加「-exec」,這不起作用。例如「find -name \ * .log'-o -name \ * .txt -exec cat'{}'\;」它只執行第一個名字 – OutputLogic

+0

,如果由於某種原因你不知道的是' o' – Crowie

0

find . -regex '.*\.\([chCH]\|cc\|CC\)'
會發現名稱以.c結尾的文件,.C,.H,.H,.CC和.cc,但是沒有找到在.hc,.CC,或任何結束。抄送。在正則表達式中,前幾個字符與名稱中的最後一個字符匹配,並且括號內的替代字符與任何單個字符c,h,C或H或cc或CC中的任一個匹配。

注意,發現的-regex-iregex開關類似於-name-iname,但正則表達式型交換機允許與|正則表達式匹配的替代。像-iname,-iregex是不區分大小寫的。

的(非功能性)形式
find . -name '*.[cCHh][cC]?$'
在前面的回答給定的沒有列出我的GNU Linux系統上的任何名稱找到4.4.2。 '*.[cCHh][cC]?$'作爲一個正則表達式的另一個問題是,它將匹配名稱,如abc.Ccxyz.hc,它們不在所需的.c,.C,.h,.H,.cc和.CC文件集合中。

+0

第一種形式不起作用,因爲'?'和'$'不是shell模式,所以它們按字面解釋 – doubleDown

+0

@rid,我編輯指出'-iregex'。* \。[ch] \ |。* \ .cc''確實*不匹配.cH。但是,我同意它匹配.Cc和.cC,併爲精確的擴展集添加了「-regex」 –

11

這應該工作

凌亂

find . -iregex '.*\.\(c\|cc\|h\)' -exec grep -nHr "$1" {} ; 

-iregex爲不區分大小寫的正則表達式。

(c|cc|h)(未示出討厭的逃逸)匹配C,CC,或h擴展


清潔

find -regextype "posix-extended" -iregex '.*\.(c|cc|h)' -exec grep -nHr "$1" {} ; 

這將找到.CC和。也是cC擴展。你被警告了。

1

該命令有效。我想我可以使用iregexiregex也會找到.Cc.cC。如果可以的話,該命令看起來像這樣。短一點。

find -regextype posix-extended -iregex '.+\.(h|H|c{1,2})$'