ディレクトリ ツリー内のテキスト ファイル内の文字列を探しています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 include、grep include exclude、grep 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.cpp
がbar.cpp
、これはおそらく目的の結果ではありません。
2021-03-04更新
元の回答を編集して、ブレース拡張これは、Bash や zsh などのいくつかのシェルで、このようなパターンを簡略化するために提供されている機能ですが、中括弧の展開は POSIX シェルに準拠していないことに注意してください。
元の例は次のとおりです。
grep pattern -r --include=\*.{cpp,h} rootdir
ディレクトリ内の全ファイル.cpp
とファイルを検索します。.h
rootdir