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
パターンと一致しない行を印刷し、-P
Perl準拠の正規表現を有効にすることで、次を使用できます。否定的なレビュー。この特定の正規表現は.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
。したがって、正規表現の末尾にgrep
aを追加すると、行の内容ではなくファイル名のみが一致します。\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