svn の特別なフォルダーを完全に除外して、svn 作業コピー内のすべての cpp/h ファイルで "foo" を検索する必要があります。GNU grepの正確なコマンドは何ですか?
6 に答える
この目的でackを使用します。これは grep に似ていますが、ソース管理ディレクトリを除外する方法を自動的に認識します (他の便利なものの中でも特に)。
grep -ir --exclude-dir=.svn foo *
作業ディレクトリで行います。検索で大文字と小文字を区別する場合は、「i」を省略します。
.cpp および .h ファイルのみをチェックする場合は、
grep -ir --include={ .cpp, .h} --exclude-dir=.svn foo *
少し話題から外れます:
追跡されていない (つまり、バージョン管理されていない) ファイルが多数ある作業コピーがあり、ソース管理されたファイルのみを検索したい場合は、次のようにします。
svn ls -R | xargs -d '\n' grep <string-to-search-for>
これはRTFMです。「man grep」と「/exclude」と入力すると、次のようになりました。
--exclude=GLOB ベース名が GLOB に一致するファイルをスキップします (ワイルドカード マッチングを使用)。ファイル名グロブでは、*、?、および [...] をワイルドカードとして使用でき、\ を使用してワイルドカードまたはバックスラッシュ文字を文字どおりに引用できます。
--exclude-from=FILE FILE から読み取ったファイル名グロブのいずれかに一致するベース名を持つファイルをスキップします (--exclude で説明されているワイルドカード マッチングを使用)。
--exclude-dir=DIR パターン DIR に一致するディレクトリを再帰的検索から除外します。
vim
これらの bash エイリアスを使用して、svn ツリーのコンテンツとファイルを grep します... GUI ベースの IDE ではなく、コマンドラインから検索する (およびコーディングに使用する) 方が高速で快適です。
s () {
local PATTERN=$1
local COLOR=$2
shift; shift;
local MOREFLAGS=$*
if ! test -n "$COLOR" ; then
# is stdout connected to terminal?
if test -t 1; then
COLOR=always
else
COLOR=none
fi
fi
find -L . \
-not \( -name .svn -a -prune \) \
-not \( -name templates_c -a -prune \) \
-not \( -name log -a -prune \) \
-not \( -name logs -a -prune \) \
-type f \
-not -name \*.swp \
-not -name \*.swo \
-not -name \*.obj \
-not -name \*.map \
-not -name access.log \
-not -name \*.gif \
-not -name \*.jpg \
-not -name \*.png \
-not -name \*.sql \
-not -name \*.js \
-exec grep -iIHn -E --color=${COLOR} ${MOREFLAGS} -e "${PATTERN}" \{\} \;
}
# s foo | less
sl () {
local PATTERN=$*
s "$PATTERN" always | less
}
# like s but only lists the files that match
smatch () {
local PATTERN=$1
s $PATTERN always -l
}
# recursive search (filenames) - find file
f () {
find -L . -not \( -name .svn -a -prune \) \( -type f -or -type d \) -name "$1"
}
このスクリプトを書き、.bashrc に追加しました。grep、find、locate から SVN ディレクトリを自動的に除外します。