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=\*~"