.svn 디렉토리를 무시하기 위해`find`를 어떻게 얻을 수 있습니까?


227

나는 종종 find명령을 사용하여 소스 코드를 검색하고 파일을 삭제합니다. 귀찮게도 Subversion은 .svn/text-base/디렉토리 에 각 파일의 복제본을 저장하기 때문에 간단한 검색으로 인해 많은 중복 결과가 발생합니다. 예를 들어, 나는 재귀 적으로 검색 할 uint여러에서 messages.h와 messages.cpp파일 :

# find -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) {
./.svn/text-base/messages.cpp.svn-base:            Log::verbose << "Discarding out of date message: id " << uint(olderMessage.id)
./.svn/text-base/messages.cpp.svn-base:    Log::verbose << "Added to send queue: " << *message << ": id " << uint(preparedMessage->id)
./.svn/text-base/messages.cpp.svn-base:                Log::error << "Received message with invalid SHA-1 hash: id " << uint(incomingMessage.id)
./.svn/text-base/messages.cpp.svn-base:            Log::verbose << "Received " << *message << ": id " << uint(incomingMessage.id)
./.svn/text-base/messages.cpp.svn-base:            Log::verbose << "Sent message: id " << uint(preparedMessage->id)
./.svn/text-base/messages.cpp.svn-base:        Log::verbose << "Discarding unsent message: id " << uint(preparedMessage->id)
./.svn/text-base/messages.cpp.svn-base:        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;
./virus/.svn/text-base/messages.cpp.svn-base:void VsMessageProcessor::_progress(const string &fileName, uint scanCount)
./virus/.svn/text-base/messages.cpp.svn-base:ProgressMessage::ProgressMessage(const string &fileName, uint scanCount)
./virus/.svn/text-base/messages.h.svn-base:    void _progress(const std::string &fileName, uint scanCount);
./virus/.svn/text-base/messages.h.svn-base:    ProgressMessage(const std::string &fileName, uint scanCount);
./virus/.svn/text-base/messages.h.svn-base:    uint        _scanCount;

디렉토리 find를 무시하도록 어떻게 알 수 .svn있습니까?


업데이트 : SVN 클라이언트를 버전 1.7로 업그레이드하면 더 이상 문제가되지 않습니다.

Subversion 1.7에서 도입 된 변경 사항의 주요 기능은 작업 사본 메타 데이터 스토리지를 단일 위치로 중앙 집중화하는 것입니다. .svn작업 복사본의 모든 디렉터리에 있는 디렉터리 대신 Subversion 1.7 작업 복사본에는 작업 복사본 .svn의 루트에 하나의 디렉터리 만 있습니다. 이 디렉토리에는 무엇보다도 해당 작업 복사본에 필요한 모든 메타 데이터 메타 데이터를 포함하는 SQLite 지원 데이터베이스가 포함됩니다.


4
성능을 위해 find ... -print0 | xargs -0 egrep ...대신 각 파일에 find ... -exec grep ...포크 를 사용 하지 말고 grep한 번에 많은 파일을 사용하십시오. 이 양식을 .svn사용하면 -prunefind 옵션을 사용하지 않고 디렉토리를 find ... -print0 | egrep -v '/\.svn' | xargs -0 egrep ...
— 정리할 수도 있습니다.

3
@ Vlad : 내가 아는 한, -execwith 를 사용하면 각 파일에 대해 +포크 grep를 사용 하지 않고 함께 사용합니다 ;. 사용은 -exec실제로 더 정확한 사용하는 것보다 xargs. ls인수 목록이 비어 있어도 같은 명령이 수행되는 반면 chmod인수가 충분하지 않으면 오류가 발생합니다. 무슨 뜻인지 보려면, 쉘 스크립트가없는 디렉토리에서 다음 명령을 시도하십시오 find /path/to/dir -name '*.sh' -print0 | xargs -0 chmod 755. 이것과 비교하십시오 : find /path/to/dir -name '*.sh' -exec chmod 755 '{}' '+'.
— Siu Ching Pong -Asuka Kenji-

2
@ 블라드 : 게다가, grep외출 .svn도 좋은 생각이 아닙니다. find파일 속성 처리에 특화되어 있지만 grep그렇지 않습니다. 예를 들어, '.svn.txt' 라는 파일 도 egrep명령에 의해 필터링됩니다 . 정규식을 '^ / \. svn $'로 수정할 수 는 있지만 여전히 좋은 방법은 아닙니다. 이 -prune술어는 find파일을 필터링하는 데 완벽하게 작동합니다 (파일 이름 또는 작성 시간 소인 또는 제공 한 조건에 따라). 큰 칼을 사용하여 바퀴벌레를 죽일 수 있다고해서 그것이 권장되는 방법은 아닙니다 :-).
— Siu Ching Pong -Asuka Kenji-

3
힘내로 전환하면이 문제가 해결되었습니다 (많은 것들 중에서). SVN과 같은 모든 폴더가 아닌 작업 복사본의 루트에 .git 폴더 만 만듭니다. 또한 .git 폴더에는 동일한 이름으로 실제 파일과 혼동되는 일반 파일이 포함되어 있지 않습니다.
— Tronic

3
2Dan Moulding : svn 1.7은 단일 최상위 .svn 디렉토리 만 만듭니다
— ccpizza

답변:


65

검색을 위해 ack을 보 시겠습니까? 그것은 소스 코드 인식 find이므로 위와 같은 소스 코드 저장소 정보를 포함하여 많은 파일 유형을 자동으로 무시합니다.


3
나는 ack매우 좋아 하지만 find -type f -name "*.[ch]" | xargs grep큰 코드베이스를 다룰 때보 다 속도가 상당히 느리다는 것을 알았습니다 .
— John Ledbetter

63
John, 저는 ack의 저자입니다. ack vs. grep의 속도 문제에 대해 자세히 설명해 주시면 감사하겠습니다. 그들은 내가 찾은 모든 경우에서 완전히 비교할 수 있습니다. github.com/petdance/ack/issues 로 알려주 거나 petdance.com의 andy로 이메일을 보내주십시오. 감사합니다.
— Andy Lester

63
여러분, 그게 팁이지만 확실히 질문에 대한 대답은 아닙니다! :)
— dolzenko

8
되지 않은 ack더 나은로 청구 grep, 소스 인식하지 find? 그것을 대체하기 위해 사용하는 몇 가지 예는 find이것이 진정한 대답이 될 것입니다.
— michiakig

3
그가 묻는 질문에 대한 답변입니다. =)
— Frungi

293

왜 안돼?

find . -not -iwholename '*.svn*'

-not 술어는 경로에 .svn이있는 모든 것을 무효화합니다.

따라서 귀하의 경우에는

find -not -iwholename '*.svn*' -name 'messages.*' -exec grep -Iw uint {} + \;

5
"-not"및 "-iwholename"에 대한 초대형 +1 Ack는 훌륭하고 그것을 사용하지만 find / exec는 여전히 그 용도를 가지고 있습니다.
— David Blevins

9
실제로 원래 질문에 대답 한 유일한 응답입니다.
— Brendon Crawford

14
나는 내 요소를 벗어 났고이 의견에 대해 비판을받을 것이 확실하지만 분명히 -not 및 -wholename은 POSIX 호환이 아닙니다. 나는 사용했다! -iwholename 대신 -not 및 -path 대신 동일한 결과를 얻었습니다. 내 매뉴얼 페이지 (Ubuntu 12.04)에 따르면이 구문은 POSIX 호환입니다.
— John

1
@whaley 당신은 '*.svn*'처음에 말했다 그러나 그때 '*.svn'. 어느 것이 맞는지? 둘 다 작동합니까? 아마 그럴 것 같아요 '*.svn*'?
— Keith M

1
@KeithM 실제로 잡을 수 있습니다. 이 답변은 몇 년 동안 여기에 앉아 있었고 지금까지 아무도 그 사실을 발견하지 못했다고 생각합니다.
— whaley

141

다음과 같이 :

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

또는 경로 접두사가 아닌 디렉토리를 기반으로 할 수도 있습니다.

find . -name .svn -a -type d -prune -o -print

14
@ 칼립 : 안녕하세요. find . -type d -name .svn -prune -o -print조금 더 빠르기 때문에 제안 합니다. 에 따르면 POSIX 표준 , 표현식은 지정된 순서대로 하나씩 평가됩니다. 의 첫 번째 표현식 -a이 false이면 두 번째 표현식은 평가되지 않습니다 ( 단락 및 평가 라고도 함 ).
— Siu Ching Pong -Asuka Kenji-

2
@Kaleb : 비교 마찬가지로 파일 형식 은 (a 비트 정수로 설정되어 있는지 여부를 테스트하는 것과)을 빠르게 비교보다 파일명 (O (N)을 나타내는 문자열 비교에 상당)를 가하고 -type d전에 것은 -name .svn이론적으로 더 효율적이다. 그러나 디렉토리 트리가 매우 큰 경우를 제외하고는 일반적으로 중요하지 않습니다.
— Siu Ching Pong -Asuka Kenji-

5
@ SiuChingPong-AsukaKenji- no, -type은 모든 파일에 대해 stat (2) 호출이 필요하므로 파일 이름 만 비교하는 것이 더 빠릅니다. 그러나 파일 이름은 readdir (3) 응답의 일부입니다.
— hraban

3
@JonathanHartley -print마지막 표현의 일부로 누락되었습니다 . 같은 뭔가 find . -name .git -prune -o \( -type f -name LICENSE -print \)작품은 예상대로.
— sschuberth

1
.git과 .svn을 모두 무시하고 다른 디렉토리를 나열하려면 find . -name .svn -prune -o -name .git -prune -o -type d -print. -type d두 개 보다 몇 밀리 초 빠르지 -name만 여분의 타이핑은 가치가 없습니다.
— JPaget

34

.svn, .git및 기타 숨겨진 디렉토리 (점으로 시작) 를 무시하려면 다음을 시도하십시오.

find . -type f -not -path '*/\.*'

그러나 사용 목적이 find파일 내에서 검색하는 경우 다음 명령을 사용하려고 시도 할 수 있습니다.

  • git grep -Git 저장소 내에서 패턴을 검색하기 위해 특별히 설계된 명령.
  • ripgrep-기본적으로에 숨겨진 파일과 파일을 무시합니다 .gitignore.

관련 : Linux에서 특정 텍스트를 포함하는 모든 파일을 찾으려면 어떻게합니까?


최고의 답변 imo. 다른 사람들은 간단한 질문에 대답하지 않는 것을 설명하려고합니다.
— Anthony

19

내가 당신의 경우에 할 것입니다 :

find . -path .svn -prune -o -name messages.* -exec grep -Iw uint {} +

Emacs의 rgrep내장 명령은 .svn디렉토리 및을 수행 할 때 관심이없는 많은 파일을 무시 합니다 find | grep. 기본적으로 사용되는 내용은 다음과 같습니다.

find . \( -path \*/SCCS -o -path \*/RCS -o -path \*/CVS -o -path \*/MCVS \
          -o -path \*/.svn -o -path \*/.git -o -path \*/.hg -o -path \*/.bzr \
          -o -path \*/_MTN -o -path \*/_darcs -o -path \*/\{arch\} \) \
     -prune -o \
       \( -name .\#\* -o -name \*.o -o -name \*\~ -o -name \*.bin -o -name \*.lbin \
          -o -name \*.so -o -name \*.a -o -name \*.ln -o -name \*.blg \
          -o -name \*.bbl -o -name \*.elc -o -name \*.lof -o -name \*.glo \
          -o -name \*.idx -o -name \*.lot -o -name \*.fmt -o -name \*.tfm \
          -o -name \*.class -o -name \*.fas -o -name \*.lib -o -name \*.mem \
          -o -name \*.x86f -o -name \*.sparcf -o -name \*.fasl -o -name \*.ufsl \
          -o -name \*.fsl -o -name \*.dxl -o -name \*.pfsl -o -name \*.dfsl \
          -o -name \*.p64fsl -o -name \*.d64fsl -o -name \*.dx64fsl -o -name \*.lo \
          -o -name \*.la -o -name \*.gmo -o -name \*.mo -o -name \*.toc \
          -o -name \*.aux -o -name \*.cp -o -name \*.fn -o -name \*.ky \
          -o -name \*.pg -o -name \*.tp -o -name \*.vr -o -name \*.cps \
          -o -name \*.fns -o -name \*.kys -o -name \*.pgs -o -name \*.tps \
          -o -name \*.vrs -o -name \*.pyc -o -name \*.pyo \) \
     -prune -o \
     -type f \( -name pattern \) -print0 \
     | xargs -0 -e grep -i -nH -e regex

대부분의 버전 제어 시스템에 의해 생성 된 디렉토리와 많은 프로그래밍 언어에 대해 생성 된 파일은 무시합니다. 이 명령을 호출하는 별명을 작성하고 대체 할 수 find및 grep특정 문제에 대한 패턴.


12

GNU 찾기

find .  ! -regex ".*[/]\.svn[/]?.*"

PHP가 처리 할 수 ​​있도록 디렉토리 경로를 배열로로드하고있었습니다. 다른 답변은 (어떤 이유로 든) 찾기에서 파일을 필터링하지 않았습니다 (에도 불구하고 -type d).이 답변은 그렇지 않습니다 . +1
— hollenbeck이 되세요

11

나는 이것을 위해 grep을 사용합니다. 이것을 ~ / .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은 자동으로 호출시이 옵션을 사용합니다


1
'grep'은 1 년 또는 2 년 전에 '--exclude-dir'옵션 만 얻었음을 주목할 가치가 있습니다. 최근 Linux 배포판에 포함되어 있지만 올바르게 기억한다면 OSX에서 grep을 컴파일해야합니다 (또는 homebrew에 요청하십시오).
— Jonathan Hartley

나는 이것의 작은 변형을 사용합니다. 내 .bashrc는 Bash 함수 'grp'를 만듭니다 GREP_OPTIONS=xxx grep "$@". 이것은 GREP_OPTIONS 변수가 'grp'를 사용하여 수동으로 실행하는 grep 인스턴스에 대해서만 설정됨을 의미합니다. 즉, 도구를 실행할 때 상황이 발생하지 않으며 내부적으로 grep을 호출하지만 grep이 예상대로 작동하지 않기 때문에 도구가 혼란스러워집니다. 또한 'grp'를 호출하는 두 번째 함수 'grpy'가 있지만 --include=*.py파이썬 파일을 검색하기 위해 추가 합니다.
— Jonathan Hartley

실제로 반영 할 때 더 이상 GREP_OPTIONS를 사용할 필요가 없습니다. 이제는 호출하는 쉘 함수 'grp'가 grep --exclude=tags --exclude_dir=.git ...etc... "$@"있습니다. 나는 이것이 'ack'처럼 실행되는 것을 좋아하지만, 그것이하는 일에 대한 인식과 통제력을 유지합니다.
— Jonathan Hartley

9

find . | grep -v \.svn


정규 표현식 .에서 탈출해야합니다 .svn.
— vladr

4
grep과 함께 --fixed-strings 를 사용하십시오 . | fgrep -v /.svn/또는`| grep -F -v / .svn /` 는 이름의 일부로 ".svn"을 가진 파일이 아닌 디렉토리를 정확하게 제외시킵니다 .
— Stephen P

8

쉽게 이해할 수있는 grep으로 명령을 파이프하지 않는 이유는 무엇입니까?

your find command| grep -v '\.svn'

정규 표현식 .에서 탈출해야합니다 .svn.
— vladr

의심의 여지없이 @Yclian; 그렇지 않으면 'tsvn', '1svn', 'asvn'등의 디렉토리도 '.'부터 무시됩니다. 정규 표현식 와일드 카드입니다 : '일치하는 문자'.
— vladr

좋아, 나는 그것이 -E와 -G의 경우에만 일어날 것이라고 생각했다. 방금 테스트했습니다. :(
— yclian

2
나는이 답변이 다른 모든 것보다 개념적으로 간단하기 때문에 좋아합니다. 'find'사용법에 대한 어리석은 구문은 기억할 수 없지만 grep -v를 사용하는 방법은 매우 많은 상황에서 사용되므로 확실히 기억할 수 있습니다.
— mattismyname

8

다음과 같은 스크립트를 작성하십시오 ~/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

이 스크립트는 일반 find명령 과 동일하게 작동 하지만 .svn디렉토리를 제거합니다. 그렇지 않으면 동작이 동일합니다.

예:

# 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;

이 스크립트는 예상대로 작동하지 않습니다. "svnfind -type f"로 실행하면 svn-directories와 svn-directories의 파일도 인쇄됩니다.
— Ingo Fischer

@ifischer echofind 명령에 를 추가하고 어떤 명령이 실행되는지 알려줄 수 있습니까? svnfind -type fRed Hat 시스템에서 잘 작동합니다.
— 존 Kugelman

좋아, 그것은 OS 의존적 인 것 같습니다. 데비안 스퀴즈 (우분투에서도 동일)를 실행하고 있습니다. "에코 추가"의 의미를 이해하지 못합니까?
— Ingo Fischer

@ifischer 마지막 ​​행을 변경하여 echo find "${OPTIONS[@]}"...실제로 실행하는 대신 find 명령을 인쇄합니다.
— John Kugelman

Ok 마지막 줄을으로 변경했습니다 echo find ${OPTIONS[@]} ${PATHS[@]} -name .svn -type d -prune -o ( ${EXPR[@]} ) $ACTION. 이렇게하면 다음과 같은 결과가 find -type f -name .svn -type d -prune -o ( -true ) -print
— 나옵니다

5

방금 질문에 설명 된 사용법 (및 기타 유사한 사용법)에 특히 적용 할 수있는 Kaleb 및 다른 게시물 ( 옵션 , 명령 , 사용법 등 을 자세히 설명)에 간단한 대안 을 추가한다고 생각 했습니다 .find -pruneackrepofind

  1. 성능을 위해, 당신은 항상 사용하려고해야 find ... -exec grep ... +하거나 (이 지적에 대한 감사 켄지) find ... | xargs egrep ...(휴대용) 또는 find ... -print0 | xargs -0 egrep ...(공백이 포함 된 파일 이름에 작품 GNU)을 대신 의 find ... -exec grep ... \;.

    find ... -exec ... +와 find | xargs형태는 포크하지 않는 egrep결과를 한 번에 파일들을 오히려 각 파일에 대해,하지만 훨씬 빠르게 실행 .

  2. 사용하는 경우 find | xargs양식을 당신은 또한 사용할 수 있습니다 grep치기 쉽고 빠르게로 .svn(또는 디렉토리 나 정규 표현식), 즉 find ... -print0 | grep -v '/\.svn' | xargs -0 egrep ...(유용 당신이 뭔가 빨리 필요하고 설정하는 방법을 기억 성가 시게 할 수없는 경우 find의 -prune논리를.)

    이 find | grep | xargs접근 방식은 GNU find의 -regex옵션 과 비슷 ghostdog74하지만 이식성이 뛰어납니다 (GNU find를 사용할 수없는 플랫폼에서도 작동 함 ).


1
@Vlad : -exec스위치 에는 두 가지 형식이 있습니다 find. 하나는로 끝나고 ;다른 하나는로 끝나는 것입니다 +. 로 끝나는 파일은 일치하는 모든 파일 목록 으로 +바뀝니다 {}. 게다가 정규 표현식도 '/\.svn'파일 이름과 일치합니다 '.svn.txt'. 자세한 내용은 질문에 대한 내 의견을 참조하십시오.
— Siu Ching Pong -Asuka Kenji-

2
@Vlad : 유틸리티에 대한 POSIX 표준은 다음과 같습니다find . -exec부분을 참조하십시오 :-).
— Siu Ching Pong -Asuka Kenji-

4

소스 코드 저장소에서는 일반적으로 텍스트 파일에 대해서만 작업을 수행하려고합니다.

첫 번째 줄은 CVS, SVN 및 GIT 리포지토리 파일을 제외한 모든 파일입니다.

두 번째 줄은 모든 이진 파일을 제외합니다.

find . -not \( -name .svn -prune -o -name .git -prune -o -name CVS -prune \) -type f -print0 | \
xargs -0 file -n | grep -v binary | cut -d ":" -f1

3

-not -path 옵션과 함께 find를 사용합니다. 나는 자두와 행운이 없었습니다.

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

대상 디렉토리 경로에 그루비 파일이 없습니다.


3

이 문제를 해결하려면 다음 찾기 조건을 사용하면됩니다.

find \( -name 'messages.*' ! -path "*/.svn/*" \) -exec grep -Iw uint {} +

다음과 같이 더 많은 제한을 추가 할 수 있습니다.

find \( -name 'messages.*' ! -path "*/.svn/*" ! -path "*/CVS/*" \) -exec grep -Iw uint {} +

이에 대한 자세한 내용은 매뉴얼 페이지 섹션 "운영자"에서 확인할 수 있습니다. http://unixhelp.ed.ac.uk/CGI/man-cgi?find


3

당신이 할 경우

find . -type f -name 'messages.*'

다음 -print전체 식 (때 암시하지 않습니다 -type f -name 'messages.*') 사실 (같은 '행동'이 더 있기 때문에, -exec).

특정 디렉토리로의 내림차순을 중지하려면 해당 디렉토리와 일치하는 것을 사용하고 그 뒤를 따라야합니다 -prune(디렉토리 내림차순 중지). 이렇게 :

find . -type d -name '.svn' -prune

이것은 .svn 디렉토리에 대해 True 로 평가되며 , -o(OR) 로 다음을 수행하여 부울 단락을 사용할 수 있습니다 . 이후 -o첫 번째 부분이 False 일 때에 만 다음에 나오는 것이 확인되므로 .svn 디렉토리 가 아닙니다 . 다시 말해 다음과 같습니다.

find . -type d -name '.svn' -prune -o -name 'message.*' -exec grep -Iw uint {}

단지 오른쪽의 무엇 evalute 것 -o, 즉, -name 'message.*' -exec grep -Iw uint {}NOT 내부 파일을 .svn 디렉토리에 대해.

그 때문에주의 .svn'. 메시지 *'가능성이 항상 디렉토리 (그리고 예를 들어 파일),이 경우에 확실히 이름과 일치하지 않습니다, 당신은뿐만 아니라을 떠날 수 -type d및 수행

find . -name '.svn' -prune -o -name 'message.*' -exec grep -Iw uint {}

마지막으로 조치를 생략하면 ( -exec조치) 다음과 같이 말하십시오.

find . -name '.svn' -prune -o -name 'message.*'

그러면 -print동작이 암시되지만 -name '.svn' -prune -o부분을 포함하여 WHOLE 식에 적용 되므로 모든 .svn 디렉토리와 'message. *'파일을 인쇄합니다. 따라서 이런 식으로 사용할 때는 항상 부울 식의 오른쪽에 '작업'을 사용해야합니다 -prune. 그리고 해당 작업이 인쇄 될 때 다음과 같이 명시 적으로 추가해야합니다.

find . -name '.svn' -prune -o -name 'message.*' -print


2

find / grep 주위의 간단한 래퍼이고 ack보다 훨씬 빠른 findrepo 를 사용해보십시오 .이 경우 다음과 같이 사용하십시오.

findrepo uint 'messages.*'

2

wcfind .svn 디렉토리를 자동으로 제거하는 데 사용하는 찾기 래퍼 스크립트입니다.


1

이것은 유닉스 프롬프트에서 나를 위해 작동합니다.

gfind. \ (-not -wholename '* \. svn *'\) -type f -name 'messages. *'-exec grep -Iw uint {} +

위의 명령은 .svn이 아닌 파일을 나열하고 언급 한 grep을 수행합니다.


'gfind'는 오타입니까? 우분투 14.04에는 없습니다.
— Jonathan Hartley

당신이 '찾기'를 의미한다고 가정하면, 이것은 효과가 없습니다. 또한 같은 파일을 필터링합니다 xxx.svnxxx. 예를 들어 svn 대신 git을 사용하는 경우 find의 결과에 .gitignore (메타 데이터가 아닌 리포지토리에 포함 된 일반 파일)와 같은 파일을 포함하는 것이 좋습니다.
— Jonathan Hartley

1

나는 보통 grep을 통해 출력을 한 번 더 .svn을 제거하여 파이프로 사용합니다. 사용시 속도가 훨씬 느리지 않습니다. 전형적인 예 :

find -name 'messages.*' -exec grep -Iw uint {} + | grep -Ev '.svn|.git|.anythingElseIwannaIgnore'

또는

find . -type f -print0 | xargs -0 egrep messages. | grep -Ev '.svn|.git|.anythingElseIwannaIgnore'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.