使っています
find . -name '*.[cCHh][cC]' -exec grep -nHr "$1" {} ';'
find . -name '*.[cCHh]' -exec grep -nHr "$1" {} ';'
.c、.C、.h、.H、.cc、および.CCで終わるすべてのサブディレクトリにリストされているすべてのファイルから文字列を取得します。しかし、これには2つのコマンドが含まれているため、非効率的だと感じます。
1つの正規表現を使用して.c、.C、.h、.H、.cc、および.CCファイルを含む正規表現を作成するにはどうすればよいですか?
編集:私はこれをLinuxマシンのbashで実行しています。
答え1
トピックで述べたように(無効なシェルモードを使用している)正規表現を使用する必要があります。
find . -iregex '.*\.[ch]+'
上記の方法は、.ch、.hhなどのファイルがある場合にそれらを見つけるための怠惰なアプローチです。正確なマッチングを行うには、まだ必要なものを列挙する必要がありますが、正規表現を使用する方が簡単です。
find . -regex '.*\.\(c\|C\|cc\|CC\|h\|H\)'
答え2
移植可能/標準(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
少なくとも2つのファイルを見つけるように)、grepにファイル名が表示されます。
$1
で始まらない限り、「--」が必要です-
。
-type f
非正規ファイル(ディレクトリなど)の表示を避けるためにここに追加されましたが、これは省略できるシンボリックリンクも除外することを意味します。
答え3
次の行に短縮できます。
find -type f -regextype posix-egrep -iregex '.*\.(cc|h|c)$' -exec grep -nHr "$1" {} \;