Find

壓縮 find 名稱模式

  • October 19, 2012

我在用

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 上執行它。

正如您(錯誤地 - 您使用的是 shell 模式)在主題中提到的那樣,您應該使用正則表達式:

find . -iregex '.*\.[ch]+'

以上是惰性方法,如果存在,它也會找到 .ch、.hh 等。對於完全匹配,您仍然必須列舉您想要的內容,但是使用正則表達式仍然更容易:

find . -regex '.*\.\(c\|C\|cc\|CC\|h\|H\)'

可移植/標準(POSIX、Unix (SUS) 和 Linux (LSB) 標準)並且高效,您可以編寫它:

find . \( -name '*.cc' -o -name '*.CC' -o -name '*.[cChH]' \) \
 -type f -exec grep -n -- "$1" /dev/null {} +

這裡最重要的一點是使用+而不是;. 否則,您將為每個文件執行一個 grep 命令。

-H選項是 GNU 特定的,但添加/dev/null(確保grep至少有兩個文件要查看)保證 grep 顯示文件名。

您將需要“–”,除非您可以確保它$1永遠不會以-.

在此處添加-type f,以避免查看非正常文件(如目錄),但這意味著它也排除了符號連結,您可能希望將其省略。

引用自:https://unix.stackexchange.com/questions/52289