martes, 27 de enero de 2015

Linux: Eliminar directorios .svn de todos los subdirectorios


En varias ocasiones he instalado el controlador de versiones Subversion (SVN), el cual es muy útil para trabajar en equipo sin dañar las modificaciones que otro miembro del equipo ha realizado al sistema. Este sistema crea un directorio oculto en cada uno de los subdirectorios del proyecto en que fue instalado y en algunos momentos es necesario eliminar estos directorios.

Eliminar cada uno de estos directorios no es mayor problema cuando el proyecto tiene solo un directorio, pero cuando el proyecto tiene muchos directorios y además utiliza framework que contienen muchos directorios anidados, la tarea puede ser interminable.

Una buena solución es utilizar la propiedad de ejecutar comandos con find en Linux.

find . -name “.svn” -type d -exec rm -rf {} \;

ó

find . -name .svn -exec /bin/rm -fR '{}' \;

Para entender un poco mejor el funcionamiento de estos comandos se describe que acción realiza cada uno de ellos.

  • find: comando de Linux utilizado para buscara archivos en directorios jerárquicos.
  • .: indica que la búsqueda debe comenzar en el directorio actual y seguir con los subdirectorios que el directorio actual contiene.
  • -name nombre_archivo: indica que se debe realizar la búsqueda de los archivos que coinciden con el nombre_archivo ingresado o con parte de ese nombre. Al no utilizar caracteres comodines como *, ? o [], el comando buscará un nombre de archivo que coincida completamente con el nombre ingresado, si utiliza caracteres comodines se buscarán los archivos que coincidan con la expresión regular generada por el nombre de los archivos más los comodines. Para utilizar comodines el nombre del archivo debe ir entre comillas dobles “.
  • -type tipo_archivo: indica el tipo de archivo que se está buscando, los tipos son:
    • b: bloque especial (buffered)
    • c: carácter especial (unbuffered)
    • d: directorio
    • p: tubería con nombre (FIFO)
    • f: archivo regular
    • l: link simbólico. Este nunca es verdadero si la opción -L o la opción -follow están en efecto, amenos que se rompa el link simbólico. Si tu deseas buscar link simbólicos cuando -L está en efecto, usa -xtype.
    • s: socket
    • D: puerta (Solaris)
  • -exec comando: Ejecuta un comando.. Es verdadero si el estado retornado es 0. Todos los argumentos siguientes a find son tomados para ser argumentos del comando hasta un argumento que consiste en ; se encuentre. La cadena '{}' es remplazada por el nombre del archivo actual siendo procesado en todas partes donde se encuentre en el argumento para el comando, no solo en argumentos donde esta solo, como en algunas versiones de find. Ambas de estas construcciones pueden ser escapadas (con un '\') o citado para protegerlos de la expansión por la shell. El comando especificado esta corriendo una vez por cada archivo encontrado. El comando es ejecutado en el comienzo del directorio. Hay inevitables problemas de seguridad circundantes al uso de la acción -exec; tu deberías usar la opción -execdir en su lugar.