特定のパスにあるファイルを除外するには、「grep」を実行します。

特定のパスにあるファイルを除外するには、「grep」を実行します。

./test/main.cppこのファイルを検索から除外したいです。

これが私が見るものです:

$ grep -r pattern --exclude=./test/main.cpp
./test/main.cpp:pattern
./lib/main.cpp:pattern
./src/main.cpp:pattern

パイプとフィルタの配列で複数のコマンドを使用して目的の出力を取得できることを知っていますが、grep基本的に望むものを理解できる引用/エスケープはありますか?

答え1

grep異なるディレクトリに同じ名前の複数のファイルがある場合、ディレクトリ内のファイルに対してこれを行うことはできません。代わりに find を使用してください。

find . -type f \! -path './test/main.cpp' -exec grep pattern {} \+

答え2

私はそれがGNUでは可能ではないと思いますgrep。しかし、パイプは必要ありません。

そしてfind

find . ! -path ./test/main.cpp -type f -exec grep pattern {} +

そしてzsh

grep pattern ./**/*~./test/main.cpp(.)

(隠しファイルを除いて.git、.svn...も除外します。)

答え3

私は本を​​書くことができる: 失われた芸術xargs。各ファイルに対してgrepを起動しますfind ... -exec … ';(しかし、withバリアントは-exec … +そうではありません)。さて、私たちは今CPUサイクルを無駄にしています。それでは、なぜできないのですか?ただし、パフォーマンス、メモリ、および消費電力が問題の場合は、xargsを使用してください。

find . -type f \! -path 'EXCLUDE-FILE' -print0 | xargs -r0 grep 'PATTERN'

GNUのfind'は出力を終了します-print0が、 'オプションはその形式を入力として使用します。これにより、ファイル内の興味深い文字がパイプに混乱しないようになります。このオプションを使用すると、何も見つからなくてもエラーは発生しません。NULxargs-0-rfind

これで、次のことができます。

find . -type f -print0 | grep -z -v "FILENAME EXCLUDE PATTERN" | 
  xargs -r0 grep 'PATTERN'

GNU grepは-zxargs 'と同じことを行います-0

答え4

参考までに私が好む方法は次のとおりです。

grep pattern $(find . -type f ! -path './test/main.cpp')

コマンドの先頭に残しておくと、grepこれがより明確になり、grep色の強調表示は無効になりません。ある意味、コマンド置換を使用するのは(制限された)ファイル検索機能のサブセットを拡張/交換する方法ですfindgrep


私のために、find -exec通事論少し神秘的です。 1つの問題find -execは(時々)さまざまな文字をエスケープする必要があることです(特に\;Bashで使用する場合)。おなじみの状況に合わせて説明すると、次の2つのコマンドは基本的に同じです。

find . ! -path ./test/main.cpp -type f -exec grep pattern {} +
find . ! -path ./test/main.cpp -type f -print0 |xargs -0 grep pattern

欲しいならサブディレクトリを除外、ワイルドカードが必要な場合があります。私はここでパターンを完全に理解していません。ミステリーについて話す:

grep pattern $(find . -type f ! -path './test/main.cpp' ! -path './lib/*' )

一般化ベースfindのソリューションのさらなる説明スクリプトで使用grepコマンドラインには-H/--with-filenameオプションを含める必要があります。それ以外の場合、検索結果にファイル名が1つしかない場合は、出力形式が変更されますfind。デフォルトのファイル検索(このオプションを使用)を使用する場合はgrep不要なようですので、これは注目に値します-r

...しかし、/dev/null最初のファイルで検索する方が良いです。これは2つの問題を解決します。

  • 検索するファイルが1つの場合はgrep2つあるとし、マルチファイル出力モードを使用していることを確認してください。
  • 検索するファイルがない場合は、ファイルがあると仮定してgrep標準入力を待たないようにします。

したがって、最終的な答えは次のようになります。

grep pattern /dev/null $(find . -type f ! -path './test/main.cpp')

関連情報