Costumo usar o findcomando para pesquisar no código fonte, excluir arquivos, o que for. Irritantemente, porque o Subversion armazena duplicatas de cada arquivo em seus .svn/text-base/diretórios, minhas pesquisas simples acabam obtendo muitos resultados duplicados. Por exemplo, desejo pesquisar recursivamente uintem vários arquivos messages.he 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;
Como posso dizer findpara ignorar os .svndiretórios?
Atualização : se você atualizar o seu cliente SVN para a versão 1.7, isso não será mais um problema.
Um recurso importante das alterações introduzidas no Subversion 1.7 é a centralização do armazenamento de metadados da cópia de trabalho em um único local. Em vez de um
.svndiretório em todos os diretórios da cópia de trabalho, as cópias de trabalho do Subversion 1.7 têm apenas um.svndiretório - na raiz da cópia de trabalho. Este diretório inclui (entre outras coisas) um banco de dados baseado em SQLite que contém todos os metadados que o Subversion precisa para essa cópia de trabalho.
-execcom +não bifurca greppara cada arquivo, enquanto usá-lo com ;faz. Usar -execé realmente mais correto do que usar xargs. Observe que comandos como lsfazem algo mesmo que a lista de argumentos esteja vazia, enquanto comandos como chmoddão um erro se houver argumentos insuficientes. Para ver o que quero dizer, tente o seguinte comando em um diretório que não tem qualquer script shell: find /path/to/dir -name '*.sh' -print0 | xargs -0 chmod 755. Compare com esta: find /path/to/dir -name '*.sh' -exec chmod 755 '{}' '+'.
grepsair .svntambém não é uma boa ideia. Enquanto findé especializado para manipular propriedades de arquivo, grepnão. No seu exemplo, um arquivo chamado '.svn.txt' também será filtrado pelo seu egrepcomando. Embora você possa modificar seu regex para '^ / \. Svn $' , ainda não é uma boa prática fazer isso. O -prunepredicado findfunciona perfeitamente para filtrar um arquivo (por nome de arquivo ou carimbo de data / hora da criação ou qualquer condição que você forneceu). É como se você pudesse matar uma barata usando uma espada grande, não significa que é a maneira sugerida de fazê-lo :-).
find ... -print0 | xargs -0 egrep ...vez defind ... -exec grep ...(não bifurcagreppara cada arquivo, mas para vários arquivos por vez). Usando este formulário, você também pode remover.svndiretórios sem usar a-pruneopção find, ou seja,find ... -print0 | egrep -v '/\.svn' | xargs -0 egrep ...