[linux] .svn 디렉토리를 무시하기 위해`find`를 어떻게 얻을 수 있습니까?
나는 종종 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 지원 데이터베이스가 포함됩니다.
답변
검색을 위해 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
대부분의 버전 제어 시스템에 의해 생성 된 디렉토리와 많은 프로그래밍 언어에 대해 생성 된 파일은 무시합니다. 이 명령을 호출하는 별명을 작성하고 대체 할 수 find
및 grep
특정 문제에 대한 패턴.
답변
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은 자동으로 호출시이 옵션을 사용합니다