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


227

나는 종종 find명령을 사용하여 소스 코드를 검색하고 파일을 삭제합니다. 귀찮게도 Subversion은 .svn/text-base/디렉토리 에 각 파일의 복제본을 저장하기 때문에 간단한 검색으로 인해 많은 중복 결과가 발생합니다. 예를 들어, 나는 재귀 적으로 검색 할 uint여러에서 messages.hmessages.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 표준 , 표현식은 지정된 순서대로 하나씩 평가됩니다. 의 첫 번째 표현식 -afalse이면 두 번째 표현식은 평가되지 않습니다 ( 단락 및 평가 라고도 함 ).
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

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


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.