나는 종종 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 지원 데이터베이스가 포함됩니다.
-exec
with 를 사용하면 각 파일에 대해 +
포크 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 '{}' '+'
.
grep
외출 .svn
도 좋은 생각이 아닙니다. find
파일 속성 처리에 특화되어 있지만 grep
그렇지 않습니다. 예를 들어, '.svn.txt' 라는 파일 도 egrep
명령에 의해 필터링됩니다 . 정규식을 '^ / \. svn $'로 수정할 수 는 있지만 여전히 좋은 방법은 아닙니다. 이 -prune
술어는 find
파일을 필터링하는 데 완벽하게 작동합니다 (파일 이름 또는 작성 시간 소인 또는 제공 한 조건에 따라). 큰 칼을 사용하여 바퀴벌레를 죽일 수 있다고해서 그것이 권장되는 방법은 아닙니다 :-).
find ... -print0 | xargs -0 egrep ...
대신 각 파일에find ... -exec grep ...
포크 를 사용 하지 말고grep
한 번에 많은 파일을 사용하십시오. 이 양식을.svn
사용하면-prune
find 옵션을 사용하지 않고 디렉토리를find ... -print0 | egrep -v '/\.svn' | xargs -0 egrep ...