web-dev-qa-db-ja.com

Grep -Rからディレクトリを除外するにはどうすればいいですか?

"node_modules"ディレクトリ以外のすべてのサブディレクトリをトラバースしたいです。

517
TIMEX

解決策1(findgrepを組み合わせる)

この解決策の目的は、grepのパフォーマンスを扱うことではなく、移植性のある解決策を示すことです。また、busyboxまたは2.5より古いGNUバージョンでも動作するはずです。

ディレクトリfooとbarを除外するには、findを使用します。

find /dir \( -name foo -Prune \) -o \( -name bar -Prune \) -o -name "*.sh" -print

次に、移植可能な解決策として、findgrepの非再帰的使用を組み合わせます。

find /dir \( -name node_modules -Prune \) -o -name "*.sh" -exec grep --color -Hn "your text to find" {} 2>/dev/null \;

解決策2(grepの再帰的使用):

あなたはこの解決法をすでに知っています、しかしそれが最も最近のそして効率的な解決法であるので私はそれを加えます。これは移植性の低いソリューションですが、人間にとって読みやすいものです。

grep -R --exclude-dir=node_modules 'some pattern' /path/to/search

複数のディレクトリを除外するには、--exclude-dirを次のように使用します。

--exclude-dir={node_modules,dir1,dir2,dir3}

解決策3(Ag)

コードを頻繁に検索する場合は、 Ag(The Silver Searcher) がgrepに代わるはるかに高速な方法であり、コード検索用にカスタマイズされています。たとえば、.gitignoreにリストされているファイルとディレクトリを自動的に無視するので、grepfindに同じ面倒な除外オプションを渡し続ける必要はありません。

232
hornetbzz

最近のバージョンの GNU Grep (> = 2.5.2 )は、

--exclude-dir=dir

これは再帰的なディレクトリ検索からパターンdirにマッチするディレクトリを除外します。

だからあなたはできる:

grep -R --exclude-dir=node_modules 'some pattern' /path/to/search

構文と使用法に関するもう少し詳しい情報はを見てください。

古いGNU Grepsと POSIX Grep の場合は、他の回答で示されているようにfindを使用してください。

または単に ack 編集 :または The Silver Searcher )を使用して、それを実行してください。

890
Johnsyweb

複数のディレクトリを除外したい場合は、

再帰的な場合は "r"、一致を含むファイルの名前のみを表示する場合は "l"、大文字と小文字の区別を無視する場合は "i"

 
 grep -rli --exclude-dir = {dir1、dir2、dir3}キーワード/path/to/search

例:Word 'hello'を含むファイルを検索したい。すべてのLinuxディレクトリprocdirectory、bootdirectory、sysを除く)を検索したい。ディレクトリとrootdirectory:

 
 grep -rli --exclude-dir = {proc、boot、root、sys} hello /

注:上記の例はrootである必要があります

注2(@skplunkerinによる):カンマの後にスペースを入れないでください{dir1,dir2,dir3}

65
Azodium

この構文

--exclude-dir={dir1,dir2}

これはgrepではなくShell(例えばBash)によって展開されます。

--exclude-dir=dir1 --exclude-dir=dir2

引用することはシェルがそれを拡張することを妨げるでしょう、それでこれはうまくいきません:

--exclude-dir='{dir1,dir2}'    <-- this won't work

--exclude-dirで使用されるパターンは、manページで--excludeオプションについて説明されているのと同じ種類のパターンです。

--exclude=GLOB
    Skip files whose base name matches GLOB (using wildcard matching).
    A file-name glob can use *, ?, and [...]  as wildcards, and \ to
    quote a wildcard or backslash character literally.

シェルは一般的に try を使ってそのようなパターン自体を拡張するので、これを避けるためには引用するべきです:

--exclude-dir='dir?'

次のように、中括弧と引用符で囲まれた除外パターンを一緒に使用できます。

--exclude-dir={'dir?','dir??'}

パターンは複数のパスセグメントにまたがることができます。

--exclude-dir='some*/?lse'

これはtopdir/something/elseのようなディレクトリを除外します。

28
Derek Veit

これをよく使う:

grepは、-r(再帰的)、i(大文字と小文字の区別なし)、および-o(一致する部分の行のみを印刷する)と組み合わせて使用​​できます。 filesを除外するには--excludeを使用し、ディレクトリを除外するには--exclude-dirを使用します。

まとめると、次のようになります。

grep -rio --exclude={filenames comma separated} \
--exclude-dir={directory names comma separated} <search term> <location>

それを記述すると、実際よりもはるかに複雑に聞こえます。簡単な例で説明しやすくなります。

例:

デバッグセッション中に文字列値debuggerを明示的に設定したすべての場所で現在のプロジェクトを検索していて、今すぐ確認/削除したいとします。

私はfindDebugger.shと呼ばれるスクリプトを書き、grepを使ってすべての出現箇所を見つけます。しかしながら:

ファイルの除外 - 私は.eslintrcが無視されることを確実にしたいです(これは実際にはdebuggerに関するリンティング規則を持っているので除外されるべきです)。同様に、私は私自身のスクリプトがいかなる結果においても参照されることを望まない。

ディレクトリの除外 - 私はdebuggerを参照するライブラリがたくさん含まれているのでnode_modulesを除外したいのですが、それらの結果には興味がありません。また、隠しディレクトリの.idea.gitを省略したいのですが、これらの検索場所についてはあまり気にせず、検索性能を維持したいのです。

これが結果です。findDebugger.shというスクリプトを作成します。

#!/usr/bin/env bash
grep -rio --exclude={.eslintrc,findDebugger.sh} \
--exclude-dir={node_modules,.idea,.git} debugger .
13
arcseldon

grep -R search . | grep -v '^node_modules/.*'のようなものを試すことができます

8
DipSwitch

Gitリポジトリでコードを探していて、node_modules.gitignoreにある場合は、git grepを使用できます。 git grepは、作業ツリー内の追跡ファイルを検索し、.gitignoreのすべてを無視します。

git grep "STUFF"
4
0xcaff

"node_modules"の中を検索したくない場合に、特に Node.js を扱う場合に非常に便利です。

find ./ -not -path "*/node_modules/*" -name "*.js" | xargs grep keyword
4
Nestor Urquiza

簡単な作業コマンド

root/dspace# grep -r --exclude-dir={log,assetstore} "creativecommons.org"

上記の私は、現在のディレクトリ "dspace"内のテキスト "creativecommons.org"をgrepし、dirs {log、assetstore}を除外します。

完了しました。

2
Dung

これは私のために働く

grep <stuff> -R --exclude-dir=<your_dir>

2
angelo.mastro
find . ! -name "node_modules" -type d 
1
Jack

多くの正解がここに与えられていますが、私はこれを追加して、以前に急いで失敗するいくつかの試みを引き起こした1つのポイントを強調しています:exclude-dirはディレクトリへのパスではなく、パターン

検索は次のようになります:

grep -r myobject

そして、あなたはsrc/other/objects-folderからの結果であなたの出力が雑然としていることに気づきます。このコマンドはnot意図した結果を提供します:

grep -r myobject --exclude-dir=src/other/objects-folder

そして、なぜexclude-dirが機能しないのか疑問に思うかもしれません!実際にobjects-folderから結果を除外するには、次のようにします。

grep -r myobject --exclude-dir=objects-folder

つまり、パスではなく、フォルダー名を使用するだけです。あなたがそれを知ったら明らかです。

Manページから:

--exclude-dir = GLOB
パターンGLOBに一致する名前のサフィックスを持つコマンドラインディレクトリをスキップします。再帰的に検索する場合、ベース名がGLOBと一致するサブディレクトリをスキップします。 GLOBの余分な末尾のスラッシュを無視します。

0
Nagev

もっと簡単な方法は "grep -v"を使って結果をフィルタすることです。

grep -i needle -R * | grep -v node_modules

0
Morris