6

私は現在使用しています

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

すべてのサブディレクトリにリストされている .c、.C、.h、.H、.cc、および .CC で終わるすべてのファイルで文字列を検索します。しかし、これには 2 つのコマンドが含まれているため、効率が悪いと感じます。

単一の正規表現パターンを使用して、.c、.C、.h、.H、.cc、および .CC ファイルを見つけるにはどうすればよいですか?

Linux マシンで bash を使用しています。

4

4 に答える 4

16

ブールOR引数を使用できます。

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

上記は、現在のディレクトリとすべてのサブディレクトリで、次のファイルで終わるファイルを検索します。

  • .c.hまたは
  • .C.Hまたは
  • .ccまた
  • .CC
于 2012-10-19T07:47:50.427 に答える
12

これはうまくいくはずです

混雑

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 拡張子も検出されます。あなたは警告されました。

于 2012-10-19T08:02:26.327 に答える
2

このコマンドは機能します。

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

使えたらいいのにiregex。とiregexも見つかります。できれば、コマンドは次のようになります。もう少し短いです。.Cc.cC

find -regextype posix-extended -iregex '.+\.(h|H|c{1,2})$'
于 2014-02-19T11:15:50.703 に答える
0

find . -regex '.*\.\([chCH]\|cc\|CC\)'
は、名前が .c、.C、.h、.H、.cc、.CC で終わるすべてのファイルを検索し、.hc、.cC、または .Cc で終わるファイルは検索しません。正規表現では、最初の数文字が名前の最後のピリオドまで一致し、括弧で囲まれた代替文字は c、h、C、または H のいずれか、または cc または CC のいずれかに一致します。

find-regexと スイッチはと-iregexに似ていますが、正規表現タイプのスイッチでは代替一致の正規表現が許可されていることに注意してください。のように、 大文字と小文字が区別されません。-name-iname|-iname-iregex

前の回答で与えられた(機能しない) フォーム
find . -name '*.[cCHh][cC]?$'
には、GNU find 4.4.2 を使用する Linux システムの名前がリストされていません。正規表現としてのもう 1 つの問題は、必要な.c、.C、.h、.H、.cc、および .CC ファイルのセットにないや など'*.[cCHh][cC]?$'の名前に一致することです。abc.Ccxyz.hc

于 2012-10-19T07:53:47.573 に答える