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

나는 종종 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 지원 데이터베이스가 포함됩니다.



답변

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


답변

왜 안돼?

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

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

따라서 귀하의 경우에는

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


답변

다음과 같이 :

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

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

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


답변

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

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

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

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

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


답변

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

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특정 문제에 대한 패턴.


답변

GNU 찾기

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


답변

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