"node_modules"ディレクトリ以外のすべてのサブディレクトリをトラバースしたいです。
解決策1(find
とgrep
を組み合わせる)
この解決策の目的は、grep
のパフォーマンスを扱うことではなく、移植性のある解決策を示すことです。また、busyboxまたは2.5より古いGNUバージョンでも動作するはずです。
ディレクトリfooとbarを除外するには、find
を使用します。
find /dir \( -name foo -Prune \) -o \( -name bar -Prune \) -o -name "*.sh" -print
次に、移植可能な解決策として、find
とgrep
の非再帰的使用を組み合わせます。
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
にリストされているファイルとディレクトリを自動的に無視するので、grep
やfind
に同じ面倒な除外オプションを渡し続ける必要はありません。
最近のバージョンの 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 )を使用して、それを実行してください。
複数のディレクトリを除外したい場合は、
再帰的な場合は "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}
この構文
--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
のようなディレクトリを除外します。
これをよく使う:
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 .
grep -R search . | grep -v '^node_modules/.*'
のようなものを試すことができます
Gitリポジトリでコードを探していて、node_modules
が.gitignore
にある場合は、git grep
を使用できます。 git grep
は、作業ツリー内の追跡ファイルを検索し、.gitignore
のすべてを無視します。
git grep "STUFF"
"node_modules"の中を検索したくない場合に、特に Node.js を扱う場合に非常に便利です。
find ./ -not -path "*/node_modules/*" -name "*.js" | xargs grep keyword
簡単な作業コマンド
root/dspace# grep -r --exclude-dir={log,assetstore} "creativecommons.org"
上記の私は、現在のディレクトリ "dspace"内のテキスト "creativecommons.org"をgrepし、dirs {log、assetstore}を除外します。
完了しました。
これは私のために働く
grep <stuff> -R --exclude-dir=<your_dir>
find . ! -name "node_modules" -type d
多くの正解がここに与えられていますが、私はこれを追加して、以前に急いで失敗するいくつかの試みを引き起こした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の余分な末尾のスラッシュを無視します。
もっと簡単な方法は "grep -v"を使って結果をフィルタすることです。
grep -i needle -R * | grep -v node_modules