4

我需要在 svn 工作副本中搜索“foo”的所有 cpp/h 文件,完全不包括 svn 的特殊文件夹。GNU grep的确切命令是什么?

4

6 回答 6

9

我为此目的使用ack ,它就像 grep 但自动知道如何排除源代码控制目录(以及其他有用的东西)。

于 2008-10-16T10:50:15.983 回答
7

grep -ir --exclude-dir=.svn foo *

在工作目录中就可以了。如果您希望搜索区分大小写,请省略“i”。

如果您只想检查 .cpp 和 .h 文件,请使用

grep -ir --include={ .cpp, .h} --exclude-dir=.svn foo *

于 2008-10-16T10:54:08.970 回答
3

有点跑题了:

如果您有一个包含大量未跟踪文件(即不受版本控制)的工作副本,并且您只想搜索源代码控制文件,您可以这样做

svn ls -R | xargs -d '\n' grep <string-to-search-for>
于 2008-10-16T11:11:38.843 回答
1

我编写了这个脚本,并将其添加到我的 .bashrc 中。它会自动从 grep、find 和 locate 中排除 SVN 目录。

于 2008-10-16T11:28:18.217 回答
1

这是一个 RTFM。我输入了“man grep”和“/exclude”并得到:

--exclude=GLOB 跳过基本名称与 GLOB 匹配的文件(使用通配符匹配)。文件名 glob 可以使用 *、? 和 [...] 作为通配符,并使用 \ 来引用通配符或反斜杠字符。

--exclude-from=FILE 跳过其基本名称与从 FILE 读取的任何文件名 glob 匹配的文件(使用 --exclude 中所述的通配符匹配)。

--exclude-dir=DIR 从递归搜索中排除匹配模式 DIR 的目录。

于 2008-10-16T10:50:57.840 回答
1

我使用这些 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"
}
于 2009-09-02T19:50:36.837 回答