web-dev-qa-db-ja.com

grepから.svnディレクトリを除外する

Subversion作業コピーディレクトリをgrepすると、結果には.svnディレクトリからの多くのファイルが含まれます。ディレクトリを再帰的にgrepすることはできますが、.svnディレクトリからすべての結果を除外しますか?

188
Kees Kist

GNU Grepがある場合、次のように動作します。

grep --exclude-dir=".svn"

GNU GrepのないUnixシステムである場合は、次を試してください。

grep -R "whatever you like" *|grep -v "\.svn/*" 
267
psychoschlumpf

Grep> = 2.5.1aの場合

これを環境に入れることができます(例:.bashrc

export GREP_OPTIONS='--exclude-dir=".svn"'

PS:Adrinanのおかげで、私のバージョンには余分な引用符があります:

export GREP_OPTIONS='--exclude-dir=.svn'
36
osgx

ack ( 'better grep')を使用すると、これが自動的に処理されます(他の多くの巧妙なことも行います!)。チェックアウトする価値は十分にあります。

36
Brian Agnew

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関数。 または、私のような非常識な人がオンラインで投稿するのを待つことができます:

http://Gist.github.com/573928

7
Max Cantor
grep --exclude-dir=".svn"

名前 ".svn"はかなり一意であるため機能します。しかし、これはより一般的な名前では失敗する可能性があります。

grep --exclude-dir="work"

防弾ではありません。「/ home/user/work」と「/ home/user/stuff/work」がある場合は両方ともスキップされます。 「/ */work/*」を定義して、除外を以前のフォルダー名のみに制限することはできません。実験できる限り、GNU grepの単純な--excludeはディレクトリを除外しません。

2
karatedog

GNU grep 2.5では、--exclude-dirsは有効なオプションではありません。代替として、これは私のためにうまくいきました:

grep --exclude="*.svn-base"

これは、.svn/を含むすべての行を除外するよりも優れたソリューションであるはずです。なぜなら、実際のファイルでそのような行を誤って除外しないからです。

2
user193130

2つのgrepsがトリックを行います:

  1. 最初のgrepがすべてを取得します。
  2. 2番目のgrepは、最初のgrepの出力を(パイピングを介して)入力として使用します。 -vフラグを使用することにより、grepは検索語と一致しない行を選択します。出来上がり。ファイルパスに.svnを含まない最初のgrepからのすべての出力が残っています。

    -v、--invert-match一致の感覚を反転させて、一致しない行を選択します。

     grep the_text_you_want_to_search_for * | grep -v .svn 
    
1
Joseph Huttner

巨大なコードベースで二重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' 
1
Sid Sarasvati

acceptable答えとして認識されないかもしれませんが、別のオプションは、リポジトリをgitにクローンしてgit grepを使用することです。

まれに、非常に大規模なsvnリポジトリに遭遇します。git-svnを介してクローンを作成するのは実際的ではありません。これらのまれなケースでは、二重のgrepソリューション svngrep を使用しますが、ここで多くの回答が示すように、これは大規模なリポジトリでは遅く、ディレクトリではない '.svn'オカレンスを除外します。私はこれらが非常にまれであると主張します...

また、複数のgrepsのパフォーマンスの低下については、gitのようなものを使用すると、svnでほとんどすべてが遅くなります!

最後に、svngrepの私のバリエーションは色付けを通過しますが、実装は、いです!大体grep -rn "$what" $where | egrep -v "$ignore" | grep --color "$what"

1
quickshiftin

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 ./
0
ZaSter