grepを使用して特定の拡張子と一致しないいくつかのファイルを除外する方法は?

grepを使用して特定の拡張子と一致しないいくつかのファイルを除外する方法は?

OKディレクトリからその単語を含むすべての行を繰り返し出力したいと思います。ただし、結果から一部の拡張子を除外する必要があります。

*~
*.map
*.js except *.debug.js

私は試した:

grep -r --exclude={*~,*.map} "OK" /some/dir

結果からデバッグではないファイルをすべて削除する方法がわかりません.js

答え1

以下でgrep削除したいと思います。

grep -r --exclude={\*~,\*.map} "OK" bar/ | grep -vP '(?<!debug)\.js'

一致を逆にし、-vパターンと一致しない行を印刷し、-PPerl準拠の正規表現を有効にすることで、次を使用できます。否定的なレビュー。この特定の正規表現は.js一致します。いいえ以前のdebug意味は(一致を逆にするため)、その.jsファイルだけが印刷されるという意味です。

しかし、@QuestionOverflowがコメントで指摘したように、フィルタリングという意図しない副作用があるかもしれません。ワイヤー含まれているOKため、jsファイルgrep -v名だけでなく出力全体に適用されます。これを防ぐには、コロンを追加するだけです(grepファイルの内容とファイル名を区別する役割)。

grep -r --exclude={*~,*.map} "OK" bar/ | grep -vP '(?<!debug).js:'

入力行にが含まれているか、foo.js:ファイル名にが含まれている:場合は、別のアプローチを使用してください。

grep -Tr --exclude={*~,*.map} "OK" bar/ | grep -vP '(?<!debug).js\t'

ファイル名とファイル内容の間にタブ文字が印刷されるようにします-T。したがって、正規表現の末尾にgrepaを追加すると、行の内容ではなくファイル名のみが一致します。\t

まだ、使用findとにかくそれはおそらくもっと意味があるでしょう。

答え2

findファイルを検索して結果をパイプするために使用するものxargs

$ find . -type f \! -name "*~" \
                 \! -name "*.map" \
                 \! \( -name "*.js" -and \! -name "*.debug.js" \) \
         -print0 | xargs -0 grep "OK"

これはすべてのファイルを検索しますいいえ*~「」、「*.map」、または「と一致しますが」*.jsは一致しません*.debug.js

この方法を使用すると、find非常に複雑なルールを簡単に検索でき、このアプローチを使用すると、誤ってdoubleを削除した場合に発生する誤った肯定を防ぐことができますgrep

答え3

私達は一緒にzshできます:

setopt extendedglob
grep OK some/dir/**/^(*~|*.map|(^*debug).js)

もちろん、パラメータリストが長すぎないと仮定し、この場合はいつでも次のことができます。

printf '%s\0' some/dir/**/^(*~|*.map|(^*debug).js) | xargs -0 grep OK

答え4

出力順序が少しずれても問題ない場合(ソートできる場合):

grep -r --exclude={*~,*.map,*.js} "OK" /some/dir **/*.debug.js

これを行うには、シェルが**再帰ワイルドカードをサポートする必要があります。 zshはすぐにこれを行い、bashは実行した後に実行しshopt -s globstar、ksh93は実行した後に実行しますset -o globstar

シェルサポートがない場合は、**2つのgrepコマンドを使用できます。

grep -r --exclude={*~,*.map,*.js} "OK" /some/dir
grep -r --include=*.debug.js "OK" /some/dir

関連情報