
./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
が、 'オプションはその形式を入力として使用します。これにより、ファイル内の興味深い文字がパイプに混乱しないようになります。このオプションを使用すると、何も見つからなくてもエラーは発生しません。NUL
xargs
-0
-r
find
これで、次のことができます。
find . -type f -print0 | grep -z -v "FILENAME EXCLUDE PATTERN" |
xargs -r0 grep 'PATTERN'
GNU grepは-z
xargs 'と同じことを行います-0
。
答え4
参考までに私が好む方法は次のとおりです。
grep pattern $(find . -type f ! -path './test/main.cpp')
コマンドの先頭に残しておくと、grep
これがより明確になり、grep
色の強調表示は無効になりません。ある意味、コマンド置換を使用するのは(制限された)ファイル検索機能のサブセットを拡張/交換する方法ですfind
。grep
私のために、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つの場合は
grep
2つあるとし、マルチファイル出力モードを使用していることを確認してください。 - 検索するファイルがない場合は、ファイルがあると仮定して
grep
標準入力を待たないようにします。
したがって、最終的な答えは次のようになります。
grep pattern /dev/null $(find . -type f ! -path './test/main.cpp')