find
El comando find busca ficheros que concuerden con un determinado criterio. La sintaxis de la línea de órdenes es la siguiente:
find [directorio...] [criterio...] [acción...]
donde directorio es el punto de partida de la búsqueda, criterio es la condición que deben cumplir los ficheros que estamos buscando y acción es lo que se hará con los ficheros encontrados. Si no se especifica ningún directorio se asume el directorio de trabajo. Si no se proporciona ningún criterio todos los ficheros son aceptados por find. Si no se especifica ninguna acción se muestran por la salida estándar los ficheros encontrados.
La siguiente orden muestra recursivamente todos los ficheros del directorio de trabajo:
$ find
.
./d
./d/cp.man
./rm.man
./ls.man.gz
A continuación vamos a ver algunos de los criterios que pueden utilizarse para la búsqueda con find. Son muchos estos criterios y se han destacado los siguientes, pero se aconseja consultar el manual del sistema (man find).
- -name 'patrón'
Exige que los nombres de los ficheros coincidan con el patrón. Es obligatorio encerrar el patrón entre comillas a menos que este no lleve caracteres especiales. El patrón es un patrón de los usados en la expansión de ficheros, y es por esto por lo que hay que ponerlo entre comillas, pues si no, será el shell y no la orden find, el que lo interprete.
$ tree .
.
├── d
│ └── cp.man
├── ls.man.gz
└── rm.man
1 directory, 3 files
$ find . -name '*.man'
./d/cp.man
./rm.man
$ find -name '*.man'
./d/cp.man
./rm.man
- -iname 'patrón'
Es igual que -name pero no se distinguirán las mayúsculas de las minúsculas en el nombre de los ficheros.
- -regex 'patrón'
Es igual que -name pero el patrón debe ser una expresión regular (se verá más adelante).
- -iregex 'patrón'
Es igual que -regex pero no se distinguirán las mayúsculas de las minúsculas en el nombre de los ficheros.
- -regextype tipo
Indica el tipo de expresión regular que entenderán -regex y -iregex. Los tipos pueden ser: emacs (valor por defecto), posix-awk, posix-basic, posix-egrep y posix-extended.
- -type carácter
Exige que el fichero sea de un tipo determinado especificado por carácter: f para fichero, d para directorio, b para dispositivo de bloque, c para dispositivo de caracteres, l para enlace simbólico.
$ find . -type d
.
./d
- -links n
Exige que el fichero tenga un número determinado de enlaces duros. En este criterio y en todos en los que hay que especificar un número, este puede escribirse de tres maneras:
| n | Indica igualdad. |
| +n | Indica mayor que. |
| -n | Indica menor que. |
$ find . -type d -links +2
.
- -perm [-/] permisos
Exige que los ficheros posean los permisos especificados. Estos se pueden dar en octal o de forma simbólica (ver ejemplos en man find). Si a los permisos no le acompaña ninguna de las dos opciones (-, /) indicará que el fichero debe tener exactamente los permisos indicados. Poner el signo menos (-) exigirá al fichero que contenga al menos los permisos especificados (subconjunto). Con el signo / se pide que los ficheros tengan algunos de los permisos que se dan.
$ find . -perm /100
.
./d
- -user usuario
Exige que el dueño del fichero sea el usuario especificado. Puede usarse tanto el nombre del usuario como el UID.
- -group grupo
Exige que el grupo del fichero sea el grupo especificado. Puede usarse tanto el nombre del grupo como el GID.
- -size [+-]n[bckMG]
Exige que el fichero tenga un tamaño determinado. Si n no lleva prefijo indica exactitud, si va con + se estará exigiendo un tamaño mayor que n y con - el tamaño debe ser menor que n. Los sufijos indican una unidad de tamaño: b para bloques de 512 bytes, c para bytes, k para kilobytes, M para megabytes y G para gigabytes.
$ find . -size +5k
./d/cp.man
./ls.man.gz
- -newer fichero
Exige que los ficheros que find seleccionará, deberán tener una fecha de modificación (mtime) posterior a la del fichero especificado con -newer. Existe también -anewer que depende de atime y -cnewer que depende de ctime.
- -mmin n
Exige que el fichero haya sido modificado como mínimo hace n minutos. Existe también -amin que depende de atime y -cmin que depende de ctime.
- -mtime n
Exige que el fichero haya sido modificado como mínimo hace n*24 horas. Existe también -atime que depende de atime y -ctime que depende de ctime.
- -inum n
Exige que el fichero tenga el número-i n.
- -samefile file
Exige que los ficheros tengan el mismo nodo-i que file.
- -maxdepth n
Se descenderán n niveles como máximo a partir del directorio especificado. El nivel 1 es el directorio especificado, el nivel 2 son los directorios hijos del directorio especificado, etc.
- -mindepth n
Se descenderán n niveles como mínimo a partir del directorio especificado.
- -empty
Exige que el fichero esté vacío.
- -nouser
Exige que el dueño del fichero sea un usuario que ya no exista (el root lo dio de baja y no se borraron todos sus ficheros).
- -nogroup
Exige que el grupo del fichero sea un grupo que ya no exista.
Algún ejemplo anterior se ha escrito con más de un criterio en la misma orden find y esto quiere decir que se exige que el fichero cumpla con todos los criterios, va implícita la condición lógica y (and, conjunción). Pero también se puede poner la conectiva o (or, disyunción) y la no (not, negación). Además, se pueden poner paréntesis para alterar las prioridades.
Exigir que se cumplan dos criterios puede hacerse de distintas formas:
- criterio1 criterio2
- criterio1 -and criterio2
- criterio1 -a criterio2
Exigir que se cumpla un criterio u otro sería:
- criterio1 -or criterio2
- criterio1 -o criterio2
Negar el criterio sería:
- -not criterio
- ! criterio
Veamos un ejemplo incluyendo paréntesis para modificar las prioridades (no, y, o). Vamos a exigir que los ficheros tengan un tamaño mayor de 10 kilobytes y sus dueños sean los usuarios juan o jose:
find . -size +10k -and \( -user juan -or -user jose \)
El comando find también suministra una amplia panoplia de acciones que se pueden realizar sobre los ficheros seleccionados, no siempre queremos mostrarlos por la salida estándar, a veces puede que nos interese borrarlos, por ejemplo. A continuación se muestran algunas acciones:
- -delete
Los ficheros o directorios que cumplan los criterios serán borrados.
$ find . -empty -delete
Los nombres de los ficheros seleccionados son enviados a la salida estándar. Es la acción por defecto.
- -printf 'formato'
Igual que print pero se usa un formato de salida, con el cual se pueden mostrar más o menos atributos de los ficheros. Es recomendable ver la página del manual.
$ find -printf "Nombre: %p inodo: %i"
Nombre: . inodo: 132809
Nombre: ./d inodo: 132797
Nombre: ./d/cp.man inodo: 132799
Nombre: ./rm.man inodo: 132810
Nombre: ./ls.man.gz inodo: 132805
- -ls
Muestra la información de un listado largo (ls -l) para cada uno de los ficheros seleccionados.
- -exec comando
Ejecuta el comando que queramos sobre los ficheros seleccionados. El nombre del fichero dentro del comando se referencia con '{}', y el comando debe acabar en \;.
$ find . -name '*.man' -exec file '{}' \;
./d/cp.man: UTF-8 Unicode text
./rm.man: UTF-8 Unicode text
- -ok comando
Es igual que -exec pero con la diferencia de que antes de que se ejecute el comando, el shell nos preguntará si verdaderamente lo queremos ejecutar. Útil por ejemplo, cuando el comando borra o modifica el fichero.
Licencia: licencia de software libre GPL