Subversion作業コピーディレクトリをgrepすると、結果には.svnディレクトリからの多くのファイルが含まれます。ディレクトリを再帰的にgrepすることはできますが、.svnディレクトリからすべての結果を除外しますか?
GNU Grepがある場合、次のように動作します。
grep --exclude-dir=".svn"
GNU GrepのないUnixシステムである場合は、次を試してください。
grep -R "whatever you like" *|grep -v "\.svn/*"
Grep> = 2.5.1aの場合
これを環境に入れることができます(例:.bashrc
)
export GREP_OPTIONS='--exclude-dir=".svn"'
PS:Adrinanのおかげで、私のバージョンには余分な引用符があります:
export GREP_OPTIONS='--exclude-dir=.svn'
ack ( 'better grep')を使用すると、これが自動的に処理されます(他の多くの巧妙なことも行います!)。チェックアウトする価値は十分にあります。
psychoschlumpfは正しいですが、grep
の最新バージョンを使用している場合にのみ機能します。以前のバージョンには--exclude-dir
オプションがありません。ただし、非常に大きなコードベースがある場合、double _grep
- ingは永遠にかかります。ポータブル.bashrc
- less grepの場合は、これを.svn
にドロップしてください:
alias sgrep='find . -path "*/.svn" -Prune -o -print0 | xargs -0 grep'
これで次のことができます。
sgrep some_var
...そして期待される結果を得る。
もちろん、あなたが私のようにだけで同じ.bashrc
を使用している非常識な人なら、書くのに4時間費やすことができます代わりに置く複雑すぎるbash関数。 または、私のような非常識な人がオンラインで投稿するのを待つことができます:
grep --exclude-dir=".svn"
名前 ".svn"はかなり一意であるため機能します。しかし、これはより一般的な名前では失敗する可能性があります。
grep --exclude-dir="work"
防弾ではありません。「/ home/user/work」と「/ home/user/stuff/work」がある場合は両方ともスキップされます。 「/ */work/*」を定義して、除外を以前のフォルダー名のみに制限することはできません。実験できる限り、GNU grepの単純な--excludeはディレクトリを除外しません。
GNU grep 2.5では、--exclude-dirs
は有効なオプションではありません。代替として、これは私のためにうまくいきました:
grep --exclude="*.svn-base"
これは、.svn/
を含むすべての行を除外するよりも優れたソリューションであるはずです。なぜなら、実際のファイルでそのような行を誤って除外しないからです。
2つのgrepsがトリックを行います:
2番目のgrepは、最初のgrepの出力を(パイピングを介して)入力として使用します。 -vフラグを使用することにより、grepは検索語と一致しない行を選択します。出来上がり。ファイルパスに.svnを含まない最初のgrepからのすべての出力が残っています。
-v、--invert-match一致の感覚を反転させて、一致しない行を選択します。
grep the_text_you_want_to_search_for * | grep -v .svn
巨大なコードベースで二重grep'inを試してみましたが、それは永遠にかかったので、同僚の助けを借りてこのソリューションを得ました
すべてを処理し、結果の表示のみを除外する「grep -v」と比較して、それらのディレクトリの処理から検索を停止するため、プルーニングははるかに高速です
find . -name .svn -Prune -o -type f -print0 | xargs -0 egrep 'YOUR STRING'
.bashrcでこのコマンドのエイリアスを作成することもできます
alias sgrep='find . -name .svn build -Prune -o -type f -print0 | xargs -0 egrep '
今すぐ使用する
sgrep 'whatever'
acceptable答えとして認識されないかもしれませんが、別のオプションは、リポジトリをgitにクローンしてgit grep
を使用することです。
まれに、非常に大規模なsvnリポジトリに遭遇します。git-svn
を介してクローンを作成するのは実際的ではありません。これらのまれなケースでは、二重のgrepソリューション svngrep を使用しますが、ここで多くの回答が示すように、これは大規模なリポジトリでは遅く、ディレクトリではない '.svn'オカレンスを除外します。私はこれらが非常にまれであると主張します...
また、複数のgrepsのパフォーマンスの低下については、gitのようなものを使用すると、svnでほとんどすべてが遅くなります!
最後に、svngrepの私のバリエーションは色付けを通過しますが、実装は、いです!大体grep -rn "$what" $where | egrep -v "$ignore" | grep --color "$what"
Grepバージョン2.5.1では、複数の--exclude
アイテムを追加して、.svn
ファイルを除外できます。
$ grep -V | grep grep
grep (GNU grep) 2.5.1
GREP_OPTIONS="--exclude=*.svn-base --exclude=entries --exclude=all-wcprops" grep -l -R whatever ./