Buscar y eliminar archivos en una sola línea con find.

borrar archivos con find

find es de esos comandos en linux que demuestran el poder de la terminal de Linux. Se que a veces no parece lo más intuitivo, pero si se domina correctamente, una sola línea en la terminal ahorra mucho tiempo.

Tratando de economizar algo de espacio en varios discos duros me encontré con esos archivitos Thumb.db. Estos archivos generados automáticamente (creo que desde Windows XP) contienen las miniaturas de las imágenes de una carpeta. Entiendo que tienen su propósito, pero en Linux no los ocupo.

Menciono a los archivos Thumb.db como ejemplo, pero este consejo se puede aplicar a cualquier grupo de archivos que pueda encontrar find.

Busca y encuentra.

No es mala idea primero buscar los archivos que se quieren eliminar, digo, solo por seguridad, no vaya a ser que en el primer intento se eliminen archivos que quieres conservar.

Supongamos que quieres buscar en una carpeta con Imágenes todos los archivos Thumbs.db, entonces tecleamos:

find /MiCarpetaConImagenes -name "Thumbs.db"

y te dará como resultado todos los archivos (incluyendo la ruta) que encontró.

/MiCarpetaConImagenes/Carpeta1/Thumbs.db
/MiCarpetaConImagenes/Carpeta2/Thumbs.db
/MiCarpetaConImagenes/Carpeta3/Thumbs.db
.
.
.
/MiCarpetaConImagenes/CarpetaN/Thumbs.db

Si todo parece correcto, entonces pasamos al siguiente paso.

Busca y destruye.

Si quieres eliminar los archivos que encontraste, entonces agrega esto al final de tu comando de búsqueda.

-exec rm -rf {} \;

De esa forma, la instrucción quedaría más o menos así:

find /MiCarpetaConImagenes -name "Thumbs.db" -exec rm -rf {} \;

Y si ejecutan la búsqueda nuevamente, lo más probable es que ya no arroje resultados, pues porque esos archivos ya fueron eliminados.

La opción delete.

En las versiones más modernas de find existe la opción -delete que borra los archivos que encuentra, pero si no funciona, pueden usar el consejo anterior.

Dicho esto, en lugar de agregar la opción -exec con sus argumentos, basta con incluir la opción -delete para borrar los archivos y si quieres ver cuales son los archivos eliminados añade la opción -print.

find /MiCarpetaConImagenes -name "Thumbs.db" -delete -print

Busca y actúa

Como verán find abre un montón de posibilidades. Se pueden buscar archivos para borrarlos, copiarlos, moverlos, jugar con expresiones regulares, bueno, lo que guste y mande. Hay una parte de búsqueda y otra de acción. Lo que quieran hacer con los archivos es posible.

Eliminar archivos de respaldo antiguos

Por ejemplo, se me ocurrió incluir en mi script de respaldos una rutina que elimine los archivos con una antigüedad mayor de 90 días.

find /CarpetaRespaldos/ -type f -mtime +90 -delete -print

El manual de find es muy completo, se los dejo para futuras referencias.

Imagen de David Pennington en Unsplash.

Buscar y reemplazar un texto desde la terminal

Buscar y reemplazar un texto desde la terminal

Uno podría suponer que una tarea de buscar una cadena de texto y reemplazarla desde un programa editor sería una tarea trivial, pero hay veces que no.

El otro día tuve la necesidad de reemplazar una cadena por otra en un archivo de texto simple y llano, nada fuera de lo ordinario, para esto estaba utilizando el editor Atom y según la búsqueda de la cadena tenía un total de un poco más de mil coincidencias, pulsé el botón Replace All  y nada pasó !!!
Dejé pasar un poco de tiempo y nada, para colmo si intentaba “apresurar” el proceso recibía como respuesta un mesaje de Editor is not responding.

Editor is not responding - Reemplazar el texto de un archivo desde la terminal
Al parece el editor estaba demasiado ocupado para atenderme.

Intenté bajar la apuesta usando un editor más simple, lo intenté con gedit y el resultado fue muy similar. Al menos Atom presentaba mejor el archivo y podía trabajar más a gusto con el archivo, pero al llegar al momento de buscar y reemplazar era jugar un albur. A veces lo lograba si presionaba el botón Keep Waiting , pero otras veces no.

Mi computadora tiene recursos más que suficientes para completar la tarea, me parecía imposible que una simple búsqueda y sustitución de una cadena de texto representara tal reto. Además si iba a hacer esto de manera rutinaria tenía que encontrar una solución más eficiente.

Domina la terminal, domina el mundo.

Al principio pensé en utilizar un editor más ligero pero no puede haber nada más ligero que la terminal y supuse que debería de existir algún comando que hiciera la tarea.

Para buscar y reemplazar un texto desde la terminal use el comando sed (stream editor for filtering and transforming text) que con una instrucción muy sencilla hizo el trabajo en menos de un segundo !!!

sed -i 's/original/nuevo/g' archivo.txt

Donde:

  • -i (in place) Es decir, el resultado lo guarda en el archivo original.
  • s (substitute) Busca una cadena y lo que encuentra lo reemplaza por otra.
  • original Es la cadena de texto que va a buscar
  • nuevo Es la cadena de texto que va a sustituir a original
  • g Quiere decir global, o sea que hará el cambio en todas las coincidencias que encuentre en el archivo
  • Y por último archivo.txt es el nombre del archivo sobre el cual va a trabajar.

Y este es tan solo un ejemplo de lo que puede hacer sed, tiene una gran variedad de opciones incluyendo el uso de expresiones regulares y lo mejor es que si es necesario, se puede programar en bash para automatizar tareas que de otro modo se tardarían una eternidad.

Guardaré este comando en mi caja de herramientas linuxeras hasta que lo vuelva a necesitar, por el momento fue de gran ayuda.

El método vi (actualización)

Poco tiempo después de publicar este artículo el buen amigo Rodolfo Zola hizo un comentario en el que me recomienda el uso de vi que también es editor de textos de terminal. Curiosamente la instrucción es muy similar a la de sed.

buscar y reemplazar con vim
Igual de rápido que el comando sed.

En el ejemplo pueden ver que sustituye la cadena em por am en un texto Lorem Ipsum de buen tamaño y lo hizo instantáneamente.