¿Cómo puedo hacer que `find` ignore los directorios .svn?
A menudo uso el find
comando para buscar en el código fuente, eliminar archivos, lo que sea. Es molesto que, debido a que Subversion almacena duplicados de cada archivo en sus .svn/text-base/
directorios, mis búsquedas simples terminan obteniendo muchos resultados duplicados. Por ejemplo, quiero buscar recursivamente uint
en varios archivos messages.h
y 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;
¿ Cómo puedo saber find
si debo ignorar los .svn
directorios?
Actualización : si actualiza su cliente SVN a la versión 1.7, esto ya no es un problema.
Una característica clave de los cambios introducidos en Subversion 1.7 es la centralización del almacenamiento de metadatos de la copia de trabajo en una única ubicación. En lugar de un
.svn
directorio en cada directorio de la copia de trabajo, las copias de trabajo de Subversion 1.7 tienen solo un.svn
directorio: en la raíz de la copia de trabajo. Este directorio incluye (entre otras cosas) una base de datos respaldada por SQLite que contiene todos los metadatos que Subversion necesita para esa copia de trabajo.
¿Por qué no solo?
find . -not -iwholename '*.svn*'
El predicado -not niega todo lo que tenga .svn en cualquier parte del camino.
Entonces en tu caso sería
find -not -iwholename '*.svn*' -name 'messages.*' -exec grep -Iw uint {} + \;
Como sigue:
find . -path '*/.svn*' -prune -o -print
O, alternativamente, basado en un directorio y no en un prefijo de ruta:
find . -name .svn -a -type d -prune -o -print
Para realizar búsquedas, ¿puedo sugerirle que consulte ack ? Es consciente del código fuente find
y, como tal, ignorará automáticamente muchos tipos de archivos, incluida la información del repositorio de código fuente como la anterior.