フォルダを再帰的に検索しますが、svn サブフォルダは除外します

フォルダを再帰的に検索しますが、svn サブフォルダは除外します

SVN によって管理されている大規模なファイル システム内のすべての出現を検索したいのですが、どのディレクトリfooに含まれるものにも一致したくありません。.svn

実行するとすぐに一致しますが、コマンドgrep -l -e 'foo' *で svn ディレクトリを除外しようとすると、ハングしてしまいます。grep -l -e 'foo' --exclude-dir=".svn"

何が間違っているのでしょうか?

答え1

--exclude-dirコマンドラインでファイルをリストする必要性がなくなるわけではありません。 はgrep標準入力を待機しているため、「ハング」しています。

grep -l -e 'foo' --exclude-dir=".svn"*

使用を検討するああは、.svnデフォルトで および同様のフォルダーを除外します (他の多くの機能もあります)。

答え2

興味があるかもしれませんああ再帰検索(および他のgrepのような操作)を行い、次のようなディレクトリを除外します。.svnまたは。ギットデフォルトでは。

答え3

このgrep --exclude-dir...解決策は問題ないはずですが、別の方法を示すために、findを使ってこれを行うことができます-prune

find -name .svn -prune -o -type f -exec grep -l "$pattern" {} +

さらに何かを実行したい場合は、findプレーンよりも優れていますgrep -r

find -name .svn -prune -o -type f -exec grep -q "$pattern" {} \; -exec ./process {} \;

答え4

次のようなディレクトリにgrepしたくない場合は、.svn これまで$GREP_OPTIONS以下のように変数を設定して除外することができます。

export GREP_OPTIONS="--exclude-dir=\*/.svn/\*"

この行を追加するだけで.bashrc、再帰 grep はディレクトリに侵入しなくなります.svn。もちろん、必要に応じて拡張できます。

export GREP_OPTIONS="--exclude-dir=\*/.svn/\* --exclude-dir=\*/.hg/\* --exclude-dir=\*/.git/\* --exclude=\*~"

関連情報