sábado, 24 de mayo de 2008

Borrar un archivo o directorio recursivamente usando el Shell

Hace casi dos meses escribí el post Borrar un archivo o directorio recursivamente en GNU/Linux en el cual creé un programa en perl que se encarga de borrar recursivame archivos o directorios.. Pues el día de hoy simplifico ese programa en una sola línea de Shell.

Pondré como ejemplo el borrar el directorio .svn, el cual para los que no lo conocen es un directorio que se crea cuando trabajamos proyectos con Subversion (SVN) en cada uno de los directorios existentes, por lo que al momento de crear una versión para entregar necesitamos remover el directorio .svn de todos los directorios en los que se encuentra.

Para borrarlo haremos uso del comando find, dicho comando nos permite buscar archivos o directorios y con la opción -exec podremos usar el comando rm para borrar los archivos que encuentra.

La estructura para ejecutar este comando será la siguiente:

javoaxian@darthmaul:~$ find /directorio/en/donde/buscar -name archivo_o_directorio_a_buscar -exec rm \-rf '{}' \;

Aquí pongo un ejemplo para borrar el directorio .svn.

javoaxian@darthmaul:~$ find /home/javoaxian/proyectos/javoaxian -name .svn -exec rm \-rf '{}' \;

El comando anterior buscará en el directorio /home/javoaxian/proyectos/javoaxian todos los directorios .svn y los borrará. Puede que mande mensajes de error que no encontró el directorio o archivo para borrar.

Si no quieren que les mande mensajes de error, pueden ejecutar esta otra forma de usar los comandos rm y find combinados:

javoaxian@darthmaul:~$ rm -rf `find /home/javoaxian/proyectos/javoaxian -name .svn`

Para verificar que funcionó, podemos ejecutar el mismo comando find pero de la siguiente manera:

javoaxian@darthmaul:~$ find /home/javoaxian/proyectos/javoaxian -name .svn -print

Ésto busca en la ruta especificada el archivo .svn y lo muestra en pantalla. No deberá mostrar nada la salida del comando si se ejecutó correctamente.

Espero que les sea de ayuda.

4 comentarios:

kmil0 dijo...

Viejo gracias.
muy util.
necesitaba hacer algo parecido :)

the_yke dijo...

Perfecto, justo el ejemplo que buscaba, y justo para lo mismo :)

Muy bien explicado además

Javier Caballero dijo...

Excelente javoaxian. Me podrias ayudar a usar este mismo esquema para borrar todos los archivos creado antes de una fecha determinada (solo los archivos anteriores a ayer, por ejemplo) dentro un directorio ??

javoaxian dijo...

Hola Javier Caballero, para hacer lo que deseas, si es algo más complejo y deberás usar otros comandos de shell por las carácteristicas que indicas, como el comando "ls -l" para saber la fecha, deberás también cortar el nombre del archivo en esa salida para saber cual es el archivo que quieres eliminar y usar el comando "rm" para borrar los archivos encontrados.

No creo que el comando "find" como tal te pueda funcionar únicamente.