El comando find es uno de los más útiles y versátiles de que disponen nuestros Linux. La potencia y la cantidad de opciones disponibles de esta utilidad es increible. Yo, que tengo una pésima memoria, tengo una chuletilla donde voy recopilando los más útiles que encuentro y/o he usado en alguna ocasión. Os copio aquí una selección y una pequeña introducción previa con los comandos más básicos para los novatos.
NOTA: Si no ejecutas el comando como root habrá muchos archivos y/o directorios a los que no tengas acceso y a los que, por tanto, el comando find no podrá acceder y no aparecerán en la lista. Aún como root es normal que en ocasiones te encuentres errores de acceso en determinados ficheros. Algo como esto:
find: «/proc/9308/task/9308/fd/5»: No existe el archivo o el directorio
NOTA (y II): Piensa que puedes combinar fácilmente entre si la mayoría de los ejemplos que veremos a continuación para obtener búsquedas aún más precisas.
Si queremos buscar un archivo de nombre archlinux.iso en nuestro equipo:
find / -name archlinux.iso
Si queremos restringir la búsqueda al directorio /opt (y todo lo que haya debajo):
find /opt -name archlinux.iso
En cualquiera de los casos anteriore podemos usar comodines en el nombre del archivo:
find / -name archlinux*.iso
Y si queremos que la búsqueda sea «insensible» a que el nombre del archivo (o la parte de este que especificamos) esté en mayúsculas o minúsculas:
find / -iname archlinux*.iso
Si sólo estamos interesados en encontrar directorios:
find / -type d -name log
Y sí sólo queremos encontrar ficheros:
find / -type f -name temp
Para encontrar archivos con distintos patrones (por ejemplo todos los iso y los tar.gz):
find /mnt/temp -type f \( -name *.iso -o -name *.tar.gz \)
O archivos que no cumplan un patrón (todos los que no sean iso):
find /mnt/temp/downloads -type f -not -name *.iso
Para encontrar archivos y directorios vacíos:
find / -empty
Para encontrar los ficheros que pertenecen a un determinado usuario:
find /opt -user josemaria
Para encontrar todos los ficheros con un determinado patrón cuyo contenido ha sido modificado por última vez hace exactamente tres días:
find /mnt/datos *.odt -type f -mtime 3
Idem pero modificados por última vez hace menos de 7 días:
find /mnt/datos *.odt -type f -mtime -7
Idem pero modificados por última vez hace más de un año:
find /mnt/datos *.odt -type f -mtime +365
NOTA: Si cambiamos mtime por atime en los tres ejemplos anteriores se realiza la búsqueda teniendo en cuenta el momento del último acceso al fichero y si usamos ctime se tiene en cuenta la última modificación no sólo del contenido del fichero sino también de sus atributos (propietario, permisos, etc.)
Para buscar los archivos con un determinado patrón y guardarlos comprimidos:
find /mnt/temp -type f -name *.txt | xargs tar cvzf textos.tar.gz
Para buscar los archivos con un determinado patrón y borrarlos:
find /mnt/temp -type f -name *.txt -exec rm {} \;
Para encontrar todos los archivos de más de 500 Megas:
find / -type f -size +500M
Idem al anterior pero mostrando el tamaño del archivo (en bytes) antes del nombre:
find / -type f -size +500M -printf '%s %p\n'
Para buscar los 10 archivos o directorios que más espacio ocupan:
find / | sort -nr | head -10
NOTA: ¿find o locate? La única ventaja de locate frente a find es que es más (mucho más) rápido, así que si realizas búsquedas a menudo y quieres que sean como centellas no te leas este texto que no es para ti. Las ventajas de find frente a locate son muchas otras (¡todas las demás que se te ocurran!). Y si no me crees leete esto.