How can I get `find` to ignore .svn directories?

后端 未结 20 1431
迷失自我
迷失自我 2020-12-04 05:05

I often use the find command to search through source code, delete files, whatever. Annoyingly, because Subversion stores duplicates of each file in its .

相关标签:
20条回答
  • 2020-12-04 05:29

    If you tell find to search through '*', then it will skip all "dot files" in the root:

    find *
    

    or with path

    find /path/*
    

    This is not an exact / perfect solution to the question. However, few solutions are simpler than this one. Performance is great too, since it doesn't even enter the hidden directories.

    shortcomings:

    • it doesn't handle nested "dot files".
    • all "dot files" are ignored, not just ".git" and ".svn".

    So in your example adding a star is the only modification you would need:

    find * -name 'messages.*' -exec grep -Iw uint {} +
    
    0 讨论(0)
  • 2020-12-04 05:30

    As follows:

    find . -path '*/.svn*' -prune -o -print
    

    Or, alternatively based on a directory and not a path prefix:

    find . -name .svn -a -type d -prune -o -print
    
    0 讨论(0)
  • 2020-12-04 05:33

    For searching, can I suggest you look at ack ? It's a source-code aware find, and as such will automatically ignore many file types, including source code repository info such as the above.

    0 讨论(0)
  • 2020-12-04 05:33

    I use grep for this purpose. Put this in your ~/.bashrc

    export GREP_OPTIONS="--binary-files=without-match --color=auto --devices=skip --exclude-dir=CVS --exclude-dir=.libs --exclude-dir=.deps --exclude-dir=.svn"
    

    grep automatically uses these options on invocation

    0 讨论(0)
  • 2020-12-04 05:33

    Create a script called ~/bin/svnfind:

    #!/bin/bash
    #
    # Attempts to behave identically to a plain `find' command while ignoring .svn/
    # directories.
    
    OPTIONS=()
    PATHS=()
    EXPR=()
    
    while [[ $1 =~ ^-[HLP]+ ]]; do
        OPTIONS+=("$1")
        shift
    done
    
    while [[ $# -gt 0 ]] && ! [[ $1 =~ '^[-(),!]' ]]; do
        PATHS+=("$1")
        shift
    done
    
    # If user's expression contains no action then we'll add the normally-implied
    # `-print'.
    ACTION=-print
    
    while [[ $# -gt 0 ]]; do
        case "$1" in
           -delete|-exec|-execdir|-fls|-fprint|-fprint0|-fprintf|-ok|-print|-okdir|-print0|-printf|-prune|-quit|-ls)
                ACTION=;;
        esac
    
        EXPR+=("$1")
        shift
    done
    
    if [[ ${#EXPR} -eq 0 ]]; then
        EXPR=(-true)
    fi
    
    exec -a "$(basename "$0")" find "${OPTIONS[@]}" "${PATHS[@]}" -name .svn -type d -prune -o '(' "${EXPR[@]}" ')' $ACTION
    

    This script behaves identically to a plain find command but it prunes out .svn directories. Otherwise the behavior is identical.

    Example:

    # svnfind -name 'messages.*' -exec grep -Iw uint {} +
    ./messages.cpp:            Log::verbose << "Discarding out of date message: id " << uint(olderMessage.id)
    ./messages.cpp:    Log::verbose << "Added to send queue: " << *message << ": id " << uint(preparedMessage->id)
    ./messages.cpp:                Log::error << "Received message with invalid SHA-1 hash: id " << uint(incomingMessage.id)
    ./messages.cpp:            Log::verbose << "Received " << *message << ": id " << uint(incomingMessage.id)
    ./messages.cpp:            Log::verbose << "Sent message: id " << uint(preparedMessage->id)
    ./messages.cpp:        Log::verbose << "Discarding unsent message: id " << uint(preparedMessage->id)
    ./messages.cpp:        for (uint i = 0; i < 10 && !_stopThreads; ++i) {
    ./virus/messages.cpp:void VsMessageProcessor::_progress(const string &fileName, uint scanCount)
    ./virus/messages.cpp:ProgressMessage::ProgressMessage(const string &fileName, uint scanCount)
    ./virus/messages.h:    void _progress(const std::string &fileName, uint scanCount);
    ./virus/messages.h:    ProgressMessage(const std::string &fileName, uint scanCount);
    ./virus/messages.h:    uint        _scanCount;
    
    0 讨论(0)
  • 2020-12-04 05:34

    I use find with the -not -path options. I have not had good luck with prune.

    find .  -name "*.groovy" -not -path "./target/*" -print
    

    will find the groovy files not in the target directory path.

    0 讨论(0)
提交回复
热议问题