grep --exclude/--include 構文を使用して、特定のファイルを grep しないようにします。質問する

grep --exclude/--include 構文を使用して、特定のファイルを grep しないようにします。質問する

ディレクトリ ツリー内のテキスト ファイル内の文字列を探していますfoo=。一般的な Linux マシンで、bash シェルを使用しています。

grep -ircl "foo=" *

ディレクトリには、一致するバイナリ ファイルも多数あります"foo="。これらの結果は関連性がなく、検索が遅くなるため、grep でこれらのファイル (主に JPEG および PNG 画像) の検索をスキップするようにします。どうすればよいでしょうか。

--exclude=PATTERNおよびオプションがあることは知っています--include=PATTERNが、パターンの形式は何ですか? grep のマニュアル ページには次のように書かれています:

--include=PATTERN     Recurse in directories only searching file matching PATTERN.
--exclude=PATTERN     Recurse in directories skip file matching PATTERN.

grep includegrep include excludegrep exclude 、variantsで検索しても関連するものは見つかりませんでした。

特定のファイルのみを grep するよりよい方法があるなら、私はそれに賛成です。問題のあるファイルを移動することは選択肢ではありません。特定のディレクトリのみを検索することはできません (ディレクトリ構造がひどく乱雑で、あらゆる場所にあらゆるものが存在しています)。また、何もインストールできないため、一般的なツール ( grepや推奨されるfindなど) を使用する必要があります。

ベストアンサー1

シェルを使用するグロブ構文:

grep pattern -r --include=\*.cpp --include=\*.h rootdir

の構文は--exclude同じです。

シェルによって展開されないように、アスタリスクはバックスラッシュでエスケープされていることに注意してください ( のように引用符で囲んで--include="*.cpp"も同じように機能します)。そうしないと、現在の作業ディレクトリにパターンに一致するファイルがある場合、コマンド ラインは のように展開されgrep pattern -r --include=foo.cpp --include=bar.cpp rootdir、 および という名前のファイルのみが検索されますfoo.cppbar.cpp、これはおそらく目的の結果ではありません。

2021-03-04更新

元の回答を編集して、ブレース拡張これは、Bash や zsh などのいくつかのシェルで、このようなパターンを簡略化するために提供されている機能ですが、中括弧の展開は POSIX シェルに準拠していないことに注意してください。

元の例は次のとおりです。

grep pattern -r --include=\*.{cpp,h} rootdir

ディレクトリ内の全ファイル.cppとファイルを検索します。.hrootdir

おすすめ記事