Ocasionalmente surge la necesidad de realizar operaciones sobre una cantidad indeterminada de archivos, como por ejemplo:
- Borrar copias de respaldo generadas automáticamente por diversas aplicaciones, que por lo general son aquellos archivos que terminan con el caracter “~” (tilde).
- Borrar archivos inútiles, como los Thumbs.db que aparecen como la plaga en nuestros pendrives o discos portátiles luego de haberlos usado en PCs con Windows.
Para casos como éstos, es bueno conocer algunos trucos de consola relacionados con el uso de tuberías (pipes). Vamos a aprender a generar una lista de archivos para luego enviarla a un comando específico que realizará su trabajo con cada elemento de la lista.
Supongamos que queremos borrar de nuestra carpeta personal todos los archivos que terminan con tilde. En primer lugar, tenemos que generar la lista de archivos a ser borrados. Para esta tarea, podemos hacer uso del comando find o del más reciente y cada vez más omnipresente comando locate.
Por ejemplo, si queremos encontrar todos los archivos de copias de respaldo en nuestra carpeta personal, podemos ejecutar indistintamente:
find $HOME -name “*~”
o:
locate *~|grep $HOME
Si preferimos ignorar la distinción entre mayúsculas y minúsculas, en find debemos sustituir -name por -iname, mientras que en locate debemos agregar el parámetro -i:
find $HOME -iname “*.jpg”
o:
locate -i .jpg|grep $HOME
Recordemos que locate busca los archivos en una base de datos que se actualiza periódicamente, mientras que find recorre el sistema de archivos desde la ubicación que le especificamos. El comando locate es rápido pero impreciso, mientras que el comando find es lento pero preciso. Además, locate no suele venir preinstalado en todas las distros. Usemos find siempre que no tengamos apuro.
Una vez que tenemos nuestra lista de archivos, necesitamos encerrar cada item de la lista entre comillas, por temor a que los espacios en blanco causen problemas. Esto se puede hacer con el comando sed (stream editor). Supongamos que decidimos usar find para generar la lista. El resultado lo procesaríamos de la siguiente manera:
find $HOME -name “*~”|sed ‘s/^/”/;s/$/”/’
El parámetro que le pasamos al comando sed sustituye (s) el inicio (^) y el final ($) de cada línea por una comilla doble (“).
Ya tenemos nuestra lista de archivos encomillada. Sólo falta pasársela al comando correspondiente. Como lo que queremos hacer es borrar archivos, ese comando será rm:
find $HOME -name “*~”|sed ‘s/^/”/;s/$/”/’|xargs rm
Usamos xargs junto con rm para evitar el problema de desbordamiento del buffer que ocurre cuando enviamos una cantidad excesiva de parámetros a un comando.
En el futuro, si queremos realizar otro tipo de tarea relacionada con una lista de archivos, basta con reemplazar en el ejemplo la especificación de archivo (“*~”) y el comando (rm) por lo que corresponda.

[...] el post anterior vimos cómo usar los comandos find y locate desde la línea de comandos. Para los enemigos del [...]