foo
SVNで管理されている大規模なファイルシステムでのすべての発生を検索したいのですが、どの.svn
ディレクトリに含まれているものにも一致させたくありません。
実行するとすぐに一致しますgrep -l -e 'foo' *
がgrep -l -e 'foo' --exclude-dir=".svn"
、コマンドでsvnディレクトリを除外しようとすると、ハングアップします。
何が悪いのですか?
foo
SVNで管理されている大規模なファイルシステムでのすべての発生を検索したいのですが、どの.svn
ディレクトリに含まれているものにも一致させたくありません。
実行するとすぐに一致しますgrep -l -e 'foo' *
がgrep -l -e 'foo' --exclude-dir=".svn"
、コマンドでsvnディレクトリを除外しようとすると、ハングアップします。
何が悪いのですか?
回答:
--exclude-dir
コマンドラインでファイルをリストする必要性に取って代わるものではありません。はgrep
標準入力を待っているため、「ハング」しています。
grep -l -e 'foo' --exclude-dir = "。svn" *
使用を検討してACK、除外.svn
デフォルトでは、同様のフォルダを(および他の多くの機能を持っています)。
--recursive .
、代わりに使用したい場合があります。OPにはすでにGNUが含まれているためgrep
です。
shopt -s dotglob
バッシュにいるので、*
すでにドットファイルが含まれています。 -r
素晴らしいですが、ack
デフォルトでもそれを行います:)
あなたはackに興味があるかもしれません。再帰的な検索(および他のgrepに似た操作)を実行し、デフォルトで.svnや.gitなどのディレクトリを除外します。
ag
、似ていますがより高速なを使用しています。
.svn
これまでのようにディレクトリにgrepしたくない場合は、次のように$GREP_OPTIONS
変数を設定して除外できます。
export GREP_OPTIONS="--exclude-dir=\*/.svn/\*"
この行をあなたに追加するだけで.bashrc
、あなたの再帰的なグループはもはや.svn
ディレクトリに入りません。もちろん、必要なだけリッチにすることもできます。
export GREP_OPTIONS="--exclude-dir=\*/.svn/\* --exclude-dir=\*/.hg/\* --exclude-dir=\*/.git/\* --exclude=\*~"
これもawkソリューションです:
find . | awk '$0 !~ /.svn/{print}' | awk '/foo/{print}'
基本的に、すべてのファイルから、/。svn /と一致するファイルをプルーニングし、それらのファイルから、/ foo /と一致するファイルのみを出力します。lsで結果を簡単に使用できるため、このソリューションも気に入っています。たとえば、
ls -tl $(find . | awk '$0 !~ /.svn/{print}' | awk '/foo/{print}')
変更日でソートされたリストビューを表示します。また、それらを使用して何かを実行したい場合(それらを開いたり、実行したりする場合など)は、結果の完全なパスを取得しておくと便利です。
*
て.
、に変更すると、よりクリーンになります。