Buscando archivos o directorios por nombre
Buscar por nombre, donde "/" es un path a partir del cual buscar, -name es el parámetro que indica a find buscar por nombre y "vim" es el nombre de archivo:
root@debian:~# find / -name vim
(También se puede usar la opción "iname" que implica un "insensitive case" o "ignorar mayúsculas ó minúsculas")
También podemos hacer uso de las expresiones regulares para definir los nombres de archivos o directorios a encontrar:
find / -name *iso
Buscará cualquier archivo o directorio cuyo nombre termine en "iso"
find / -name [Mm]y.cfg
Buscará el archivo "My.cfg" ó el archivo "my.cfg"
find / -name '[0-9][0-9]-[0-9][0-9]*'
27-08-12-test
Buscará cualquier archivo o directorio cuyo nombre este compuesto por dos dígitos consecutivos entre 0 y 9 separados por un guión de otros dos dígitos consecutivos comprendidos entre 0 y 9 y seguidos por cualquier dígito.
Esto es muy útil cuando queremos buscar archivos en cuyo nombre hay una fecha precedida o seguida por caracteres:
Por ejemplo para buscar todos los archivos de Agosto del año 2012(en caso que esté expresado en 2 dígitos), usaríamos la expresión regular:
find / -name '[0-9][0-9]-08-12'*
/root/25-08-12-test
/root/26-08-12-test
/root/27-08-12-test
Nota: Tener en cuenta que los programas generalmente adoptarán la nomenclatura inglesa para definir las fechas usando año-mes-día en lugar de día-mes-año.
find / -name '[^a-zA-Z.]*'
Buscará cualquier archivo o directorio cuyo nombre NO empiece con ninguna letra comprendida entre la "a" y "z" ó entre "A" y "Z". (El caracter ^ significa "distinto de " en el ámbito de la expresiones regulares y el punto detrás de la Z indica que NO se muestren los archivos ocultos)
find /root/ -name '[^0-9]*'
Buscará en el mismo directorio que el ejemplo anterior, todos los archivos o directorios cuyo nombre NO comience con un número comprendido entre 0 y 9(esta vez omito el punto, y se mostrarán los archivos ocultos).
Como el tema de las expresiones regulares es MUY extenso, dejaremos acá el tema de la búsqueda de archivos o directorios por nombres, aunque pienso dedicarle un artículo más adelante xD.
Viendo los resultados que nos arroja la terminal en la imagen de arriba no estamos del todo seguros de qué es cada resultado...un archivo o un directorio?
Buscando archivos o directorios por tipo
Para esto podemos usar el modificador "-type d" o "-type f" en find, para especificar si queremos que sólo nos muestre directorios o archivos respectivamente:
find / -type d -name vim
Buscando archivos por nivel de directorios
También podemos especificar la "profundidad" máxima o mínima en que queremos que find busque un directorio o archivo con el parámetro -maxdepth o -mindepth y un argumento numérico como ser 2 para el caso de un directorio y su subdirectorio:find / -maxdepth 2 -type d -name vim
En la siguiente captura del terminal vemos como find excluye los directorios que estan más allá de una "profundidad" de 2:
Por el contrario con la el argumento 3 al parámetro mindepth excluirá el resultado del ejemplo anterior y mostrará los que estén más allá de 2:
Buscando archivos por tamaño
También podemos usar la opción "-size" con diferentes modificadores para ver por ejemplo archivos con más ó menos de "n" unidades de espacio donde:b especifica bloques de 512 bytes
c especifica bytes
w especifica 2 bytes
k especifica unidades de 1024 bytes
M especifica unidades en Megabytes
G especifica unidades en Gigabytes
Ejemplo:
find / -type f -size +1k
Buscará a partir de root(/) archivos (-type f) con un tamaño mayor a 1kilobyte y
find / -type f -size -1k
Buscará a partir de root(/) archivos (-type f) con un tamaño menor a 1kilobyte.
Tener en cuenta esta funcionalidad, puede ser muy útil a la hora de determinar cuáles son los archivos que han crecido desmesuradamente en el caso de un sistema que haya agotado su capacidad de disco o esté próximo a hacerlo.
Por ejemplo:
find / -type f -size +1G
buscará archivos con un tamaño mayor a un Gigabyte.
En el siguiente ejemplo le decimos a find que busque a partir del directorio /home cualquier archivo que ocupe un espacio mayor a 100 Megabytes y encuentra una imagen de instalación de red de Debian que ocupa 192 Megabytes, como nos muestra el comando "du"(Disk usage)
Buscando archivos por fecha de creación, de acceso, o de modificación.
Find además de las formas que vimos antes, puede utilizar aún más información contenida en los bloques de datos de un archivo o directorio, como las fechas de creación, acceso o modificación.
Veamos lo que nos dice el comando "stat" de un archivo arbitrariamente llamado "27-08-12-test":
stat 27-08-12-test
File: «27-08-12-test»
Size: 2 Blocks: 8 IO Block: 4096 fichero regular
Device: 801h/2049d Inode: 258383 Links: 1Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2012-08-27 02:14:52.000000000 -0300
Modify: 2012-08-27 02:19:27.000000000 -0300
Change: 2012-08-27 02:19:27.000000000 -0300
Como vemos en el ejemplo el archivo fue accedido a las 02:14:52, modificado y cambiado a las 02:19:27 (hora local GMT -3)
Usando el comando find con la opción "-mmin -10" especifico que encuentre cualquier archivo o directorio modificado durante los 10 minutos anteriores a la ejecución del comando
find /root/ -mmin -10
/root/
/root/.viminfo
/root/27-08-12-test
date
lun ago 27 02:23:09 ART 2012
Así como "mmin" para la opción "modificado", tenemos "amin" para "accesado", "cmin" para "cambiado", esta última además de un cambio en cuanto al contenido del archivo, cambia cuando cambiamos los permisos o el número de inodo del bloque de datos.
También tenemos la opción de especificar las opciones "mtime", "atime" y "ctime" para modificado, accedido, o cambiado y se especifican en "n x 24hs".
Ejemplos:
find / -mtime +1 especifica archivos que fueron modificados hace más de 24 horas.
find / -mtime -1 especifica archivos que fueron modificados hace menos de 24 horas.
Ejecutar comandos sobre los archivos que find encuentra
Find puede ejecutar comandos por cada resultado en forma independiente. Por ejemplo, vamos a especificar que ademas de encontrar archivos que sean mayores de 100 Megabytes, nos diga cuanto espacio en disco ocupa cada archivo usando la orden -exec:
En internet he visto muchos ejemplos de usar find con -exec, combinado con "rm -r" para borrar archivos según el criterio de búsqueda especificado, lo cual no es una práctica para nada recomendable, ya que un pequeño error y podríamos perder archivos importantes, incluso borrar archivos del sistema y dejarlo inutilizable. Así que mucho cuidado a la hora de ejecutar comandos con find, en todo caso utilizar la opción "rm -i" para que el shell les pregunte por si o por no antes de borrar algo.
Más ejemplos de uso de la opción -exec:
find / -name *.mp3 -exec cp {} /home/Musica/ ;
esto buscará todos los archivos mp3 en el sistema y los copiará al directorio /home/Musica.
find / -type f -name *.mp3 | wc -l
Contará la cantidad de archivos con extension mp3 encontrados en el sistema
Buscará archivos en el directorio actual con extensión ".bak" y nos preguntará si aceptamos borrarlo(a cada uno)
find /home -exec rename 'tr/A-Z/a-z/' "{}" \;
Renombrará en el directorio /home todos los archivos que contengan mayúsculas en su nombre a minúsculas.
Cambiará los permisos de todos los archivos en el directorio /home a 755.
El comando find no se limita únicamente a lo que he mostrado, sino que puede usarse de maneras aún mas complejas, con mas opciones, incluyendo redirecciones, expresiones regulares simples y extendidas, puede ejecutar scripts y utilizarse dentro de scripts, o combinado con otros comandos, tanto a la entrada como a la salida. Cada uno se va armando en e día a día de las combinaciones que le son más útiles según la tarea que se esté realizando, y cada tanto conviene darle una revisada al manual, pero si estás buscando algo, no dudes que "find" será LA solución xD.