Find壓縮
壓縮 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 上執行它。
正如您(錯誤地 - 您使用的是 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
,以避免查看非正常文件(如目錄),但這意味著它也排除了符號連結,您可能希望將其省略。