我需要在 svn 工作副本中搜索“foo”的所有 cpp/h 文件,完全不包括 svn 的特殊文件夹。GNU grep的确切命令是什么?
6 回答
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>
我编写了这个脚本,并将其添加到我的 .bashrc 中。它会自动从 grep、find 和 locate 中排除 SVN 目录。
这是一个 RTFM。我输入了“man grep”和“/exclude”并得到:
--exclude=GLOB 跳过基本名称与 GLOB 匹配的文件(使用通配符匹配)。文件名 glob 可以使用 *、? 和 [...] 作为通配符,并使用 \ 来引用通配符或反斜杠字符。
--exclude-from=FILE 跳过其基本名称与从 FILE 读取的任何文件名 glob 匹配的文件(使用 --exclude 中所述的通配符匹配)。
--exclude-dir=DIR 从递归搜索中排除匹配模式 DIR 的目录。
我使用这些 bash 别名来 grepping svn 树中的内容和文件......我发现从命令行搜索(并vim
用于编码)而不是基于 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"
}