1. ホーム
  2. unix

[解決済み] grep --exclude/--include構文を使って特定のファイルをgrepしないようにする

2022-03-22 05:33:33

質問

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

grep -ircl "foo=" *

また、ディレクトリの中には "foo=" . これらの結果は関連性がなく、検索が遅くなるので、これらのファイル(主にJPEGとPNG画像)の検索をgrepがスキップするようにしたいのです。どうすればいいのでしょうか?

があるのは知っています。 --exclude=PATTERN--include=PATTERN というオプションがありますが、パターン形式はどうなっているのでしょうか?grepのmanページにはこう書いてあります。

--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 とバリアントは何も関連するものを見つけられませんでした

特定のファイルだけをgrepする良い方法があれば、大賛成です。問題のファイルを移動することは選択肢にありません。特定のディレクトリだけを検索することはできません(ディレクトリ構造が大混乱で、あらゆるものがどこにでもある状態です)。また、何もインストールできないので、一般的なツール(例えば グレップ または、提案された 見つける ).

解決方法は?

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

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 などのシェルが提供する機能で、このようなパターンを簡略化することができます。

元の例は

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

を検索すると、すべての .cpp.h ディレクトリにルートされたファイル rootdir .