我需要在svn工作副本中搜索“foo”中的所有cpp / h文件,完全不包括svn的特殊文件夹。 GNU grep的完全命令是什么?
答案 0 :(得分:9)
我为此目的使用ack,它就像grep但自动知道如何排除源控制目录(以及其他有用的东西)。
答案 1 :(得分:7)
grep -ir --exclude-dir = .svn foo *
在工作目录中会这样做。 如果您希望搜索区分大小写,请忽略“i”。
如果您只想检查.cpp和.h文件,请使用
grep -ir --include = { .cpp, .h} --exclude-dir = .svn foo *
答案 2 :(得分:2)
偏离主题:
如果你有一份包含大量未跟踪文件的工作副本(即不受版本控制),并且仅想要搜索源控制文件,你可以这样做
svn ls -R | xargs -d '\n' grep <string-to-search-for>
答案 3 :(得分:1)
这是一个RTFM。我键入'man grep'和'/ exclude'并得到:
- 排除= GLOB 跳过基本名称与GLOB匹配的文件(使用通配符) 匹配)。文件名glob可以使用*,?和[...]作为 通配符和\,引用通配符或反斜杠字符 字面上。
- 排除-从= FILE 跳过基本名称与任何文件名称globs匹配的文件 从FILE读取(使用通配符匹配,如下所述) --exclude)。
- 排除-DIR = DIR 从递归中排除与模式DIR匹配的目录 搜索。
答案 4 :(得分:1)
我写了this脚本,我已将其添加到我的.bashrc中。它会自动从grep,find和locate中排除SVN目录。
答案 5 :(得分:1)
我使用这些bash别名来搜索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"
}