A menudo uso el find
comando para buscar a través del código fuente, eliminar archivos, lo que sea. Molesto, 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 múltiples messages.h
y messages.cpp
archivos:
# 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 decir find
que ignore 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 sola 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 un solo.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 todas las necesidades de Subversion de metadatos para esa copia de trabajo.
-exec
with +
no fork grep
para cada archivo, mientras que usarlo con ;
does. Usar -exec
es en realidad más correcto que usar xargs
. Tenga en cuenta que los comandos como ls
hacer algo, incluso si la lista de argumentos está vacía, mientras que los comandos como chmod
dan un error si no hay suficientes argumentos. Para ver lo que quiero decir, sólo tratar el siguiente comando en un directorio que no tiene ningún script de shell: find /path/to/dir -name '*.sh' -print0 | xargs -0 chmod 755
. Comparar con éste: find /path/to/dir -name '*.sh' -exec chmod 755 '{}' '+'
.
grep
salir .svn
no es una buena idea también. Si bien find
está especializado para manejar propiedades de archivos, grep
no lo hace. En su ejemplo, su comando también filtrará un archivo llamado '.svn.txt'egrep
. Aunque puede modificar su expresión regular a '^ / \. Svn $' , aún no es una buena práctica hacerlo. El -prune
predicado de find
funciona perfectamente para filtrar un archivo (por nombre de archivo, o marca de tiempo de creación, o cualquier condición que haya proporcionado). Es como si incluso pudieras matar una cucaracha usando una gran espada, no significa que sea la forma sugerida de hacerlo :-).
find ... -print0 | xargs -0 egrep ...
lugar defind ... -exec grep ...
(no se bifurcagrep
para cada archivo, sino para un montón de archivos a la vez). Con este formulario también puede podar.svn
directorios sin usar la-prune
opción de buscar, es decirfind ... -print0 | egrep -v '/\.svn' | xargs -0 egrep ...