¿Cómo puedo hacer que `find` ignore los directorios .svn?

Resuelto John Kugelman asked hace 14 años • 19 respuestas

A menudo uso el findcomando 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 uinten varios archivos messages.hy 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 findsi debo ignorar los .svndirectorios?


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 .svndirectorio en cada directorio de la copia de trabajo, las copias de trabajo de Subversion 1.7 tienen solo un .svndirectorio: 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.

John Kugelman avatar Feb 23 '10 05:02 John Kugelman
Aceptado

¿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 {} + \;
whaley avatar Jul 20 '2010 01:07 whaley

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
Kaleb Pederson avatar Feb 22 '2010 22:02 Kaleb Pederson

Para realizar búsquedas, ¿puedo sugerirle que consulte ack ? Es consciente del código fuente findy, como tal, ignorará automáticamente muchos tipos de archivos, incluida la información del repositorio de código fuente como la anterior.

Brian Agnew avatar Feb 22 '2010 22:02 Brian Agnew