A menudo uso el findcomando 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 uinten múltiples messages.hy messages.cpparchivos:
# 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 findque ignore 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 sola ubicación. En lugar de un
.svndirectorio en cada directorio de la copia de trabajo, las copias de trabajo de Subversion 1.7 tienen un solo.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 todas las necesidades de Subversion de metadatos para esa copia de trabajo.
-execwith +no fork greppara cada archivo, mientras que usarlo con ;does. Usar -execes en realidad más correcto que usar xargs. Tenga en cuenta que los comandos como lshacer algo, incluso si la lista de argumentos está vacía, mientras que los comandos como chmoddan 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 '{}' '+'.
grepsalir .svnno es una buena idea también. Si bien findestá especializado para manejar propiedades de archivos, grepno 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 -prunepredicado de findfunciona 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 bifurcagreppara cada archivo, sino para un montón de archivos a la vez). Con este formulario también puede podar.svndirectorios sin usar la-pruneopción de buscar, es decirfind ... -print0 | egrep -v '/\.svn' | xargs -0 egrep ...