我怎样才能让`find`忽略.svn目录?

我经常使用find命令搜索源代码,删除文件等等。 令人烦恼的是,由于Subversion在其.svn/text-base/目录中存储了每个文件的重复项,我的简单搜索最终得到了大量重复的结果。 例如,我想递归搜索多个messages.hmessages.cpp文件中的uint

# 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支持的数据库,其中包含该工作副本的所有元数据Subversion需求。


为了搜索,我可以建议你看看吗? 这是一个源代码意识的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
链接地址: http://www.djcxy.com/p/56855.html

上一篇: How can I get `find` to ignore .svn directories?

下一篇: How to call shell script from another shell script?