Comando Find |
SOFTWARE - General | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Mercredi, 20 Février 2008 22:35 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There are no translations available. Find es un comando muy utilizado por usuarios Linux, pero la mayoría de ellos utiliza una mínima parte de su potencia, descúbrela gracias a este artículo! 1. IntroducciónFind es un comando que se utiliza para buscar archivos dentro de la jerarquía de directorios del sistema y opcionalmente, que cumplan una serie de reglas de búsqueda. Find no solo busca archivos regulares sino cualquier clase de nodo que tenga una entrada en un directorio, como puede ser por ejemplo: un enlace simbólico, un subdirectorio, un fichero especial de bloques, etc Pero además de buscar archivos, find tiene la posibilidad de realizar operaciones sobre los ficheros que encuentra. Find tiene una gran cantidad de parámetros y criterios de búsqueda lo que le hace muy flexible y potente, casi indispensable para realizar tareas administrativas. Por último, find es un comando muy utilizado por usuarios Linux, pero la mayoría de ellos utiliza una mínima parte de su potencia, debido a que es difícil recordar todas sus opciones. Aquí, en este artículo veremos como aprovechar el gran potencial de este comando. 2. FindutilsEste paquete contiene programas para la búsqueda de ficheros, unos independientes para hacer búsquedas recursivas y otros, para crear, mantener y consultar una base de datos y realizar búsquedas por medio de ella. Quizás estos últimos sean más rápidos, pero deberemos tener la base de datos actualizada antes de realizar la acción. Entre estos programas contenidos en findutils, se encuentra find y otros como:
locate guarda las rutas de los ficheros (además de permisos y características de pertenencia, para preservar la privacidad) en una base de datos llamada slocate.
Una forma muy útil y práctica de automatizar la actualización de la base de datos slocate es programar la ejecución de un shell-script diario (por ejemplo cada noche) con la utilidad cron que ofrece Linux.
Seguramente todos estos programas estarán instalados en nuestro sistema Linux*. Si no es así los tendremos que instalar.
Ejecutamos como root
Ejecutamos como root
ó
La potencia de comando find no reside en la rapidez que encuentra los ficheros deseados (el comando locate solo tiene que hacer una consulta a la base de datos y no realizar una búsqueda recursiva), sino en la gran cantidad de reglas por las que podemos filtrar la búsqueda, como por ejemplo: por su fecha de creación, tamaño del fichero, permisos, y un largo etcétera... además de posteriormente poder efectuar operaciones sobre el resultado. 3. Utilización de findFind siempre devuelve un código de estado de tal forma que si es igual a 0 significa que la búsqueda ha acabado satisfactoriamente y puede continuar con la ejecución de alguna acción sobre el resultado (si es el caso) y, mayor que 0 si ha ocurrido algún error. Aunque a priori la sintaxis de find se ve sencilla, en realidad se pueden utilizar una gran variedad de opciones como se puede constatar en la página de ayuda en línea correspondiente (man find). Find siempre empieza la búsqueda en un directorio y luego desciende por sus subdirectorios buscando el patrón indicado (con algunas opciones podemos indicar el nivel de profundidad). Si no se especifica ningún directorio de búsqueda, find recoge el valor de la variable PWD, es decir, asume el directorio actual.
Find utiliza las opciones -name y -print por defecto, es decir, si ejecutamos find a secas, listará el contenido del directorio donde estemos situados de forma recursiva.
3.1. Sintaxisfind [ruta] [expresión]
Expresión Como se ha comentado el parámetro expresión puede ser una combinación de opciones, comparaciones, operadores y acciones. Para dotar más claridad a la expresión, es aconsejable poner primero las opciones y después las acciones sobre ellas, sino, nos puede aparecer una advertencia, como esta:
Hay que reseñar que, la lista de opciones, comparaciones y acciones es muy extensa. Resaltaremos las más importantes. De nuevo, podemos recurrir a la ayuda en línea (man find) para ver todas. 3.2. OpcionesLo primero que debe aparecer en la expresión son las opciones, ya que definen como realizar la búsqueda. -maxdepth {n}. Find buscará de forma recursiva hasta un máximo de n niveles de subdirectorios por debajo del especificado. Por ejemplo, con -maxdepth 1 buscaremos en el directorio actual de forma no recursiva (no "bajaremos" a los subdirectorios). Lo vemos:
-mindepth {n}. Similar a maxdepth pero comenzará a buscar a partir de n niveles. Por ejemplo, con -mindepth 2 buscaremos sin tener en cuenta el directorio actual. Realizará la búsqueda a partir de los subdirectorios y de forma recursiva. Lo vemos:
-mount. No descender a directorios montados en otros sistemas de ficheros. Muy útil si tenemos mapeadas algunas unidades de red. 3.3. ComparacionesAlgunas comparaciones suelen llevar argumentos numéricos. Es importante que entendamos su significado:
Patrón Muchas veces realizaremos búsquedas que cumplan un patrón (expresión regular que incluye un conjunto de cadenas de caracteres), es decir, no buscar un determinado fichero sino un grupo seleccionado de ellos que tengan en común ciertos caracteres de su nombre o su extensión por ejemplo. La sintaxis correcta del patrón es la siguiente:
También la cadena puede contener rangos como por ejemplo incluir todas las letras minúsculas y los números [a-z0-9].
Es aconsejable que el patrón vaya ente comillas simples. Ejemplos: · '?valen*' : podrían ser 1valentino y vvalen. · '*.jpg': cualquier archivo con extensión jpg. · '*1*.txt': cualquier archivo .txt que su nombre contuviera un 1. · '*[1]*.txt: igual que el ejemplo anterior. · '[0-9]?rt*.??q': coincidirían por ejemplo los archivos 03rt.44q y 1trtexample.exq · 'ejercicio[0-9]*: coincidirían ejercicio1.txt, ejercicio1.c, etc... · '[^0-9A-Z]example.php': coincidirían aexample.php. bexample.php. En definitiva cualquier fichero example.php cuyo primer carácter sea un letra minúscula. · '*[a-z]*.odt: coincidirían *zprimero.odt, *ssss.odt; es decir, el primer carácter deberá ser un asterisco. Lista de comparaciones -amin {n}: búsqueda de ficheros que han sido leídos hace n minutos. Por ejemplo:
Veríamos todos los ficheros que se han leído en los últimos 9 minutos partiendo desde el directorio actual.
-atime {n}: búsqueda de ficheros que han sido leídos por última vez hace nx24 horas. Por ejemplo:
Veríamos todos los ficheros que se han leído en las últimas 24 horas partiendo desde el directorio actual. -cmin {n}: búsqueda de ficheros cuyos permisos se han cambiado hace n minutos. Por ejemplo:
Veríamos todos los ficheros cuyos permisos han sido cambiados en los últimos 9 minutos partiendo desde el directorio actual. -ctime {n}: búsqueda de ficheros cuyos permisos se han cambiado por última vez hace nx24 horas. Por ejemplo:
Veríamos todos los ficheros cuyos permisos se han cambiado en las últimas 24 horas partiendo desde el directorio actual. -mmin {n}: búsqueda de ficheros que han sido modificados (su contenido) hace n minutos. Por ejemplo:
Veríamos todos los ficheros que han sido modificados hace exactamente 4 minutos partiendo desde el directorio actual. -mtime n; busqueda de ficheros que han sido modificados por última vez hace nx24h. Por ejemplo:
Veríamos todos los ficheros que han sido modificados a partir de 24h hacia adelante en el tiempo, partiendo desde el directorio actual. -empty: búsqueda de ficheros o directorios vacíos. Muy útil para "hacer limpieza" del disco duro. -fstype {tipo}: especificamos el tipo de sistema de archivos donde queremos realizar la busqueda (en /proc/filesystem podemos ver la lista de todos los sistemas de ficheros registrados en el sistema). Por ejemplo:
Buscaríamos todos los ficheros del sistema de archivos ntfs ignorando todos los demás. -gid {n}: buscamos ficheros que pertenezcan al grupo con identificador igual a n.
-group {nombre}: igual que la expresión anterior, pero esta vez buscamos por el nombre del grupo. -lname {patrón}: buscamos enlaces simbólicos que coincidan con el patrón. Con ilname ignoramos las mayúsculas o minúsculas. -name {patrón}: buscamos los ficheros que coincidan con el patrón. Con iname ignoramos las mayúsculas o minúsculas. -links {n}: buscamos ficheros con n enlaces. -nouser: buscamos ficheros que no pertenezcan a ningún usuario. Es decir, el uid del fichero no coincide con el UID de ningún usuario. -nogroup: igual que la expresión anterior pero con gid (identificador de grupo). -path {patrón}: búsqueda del patrón que coincida con el path o ruta. Por ejemplo:
Buscaría y mostraría cualquier path que contuviera *reg*, como por ejemplo: /gnome2/Desktop/log/registro1/1.jpg Con ipath ignoramos las mayúsculas y minúsculas. -perm {modo}: buscamos los ficheros que coincidan exactamente con los permisos en representación octal (de 0 a 7) o en representación simbólica (r para lectura, x para ejecución, w para escritura). Ejemplo:
Para representación simbólica nos referiremos al propietario del fichero con u, al grupo con g y al resto con o. Por ejemplo, el resultado de la instrucción anterior es idéntica a esta:
-perm {-modo}: buscaremos los ficheros que coincidan exactamente con los permisos o que al menos tengan estos permisos el propietario, el grupo y el resto en representación octal o en representación simbólica. Por ejemplo: -666: lo cumplirían archivos que tuvieran de permisos rw-rw-rw-. Un fichero con permisos rwx-rw-rw- si lo cumpliría. Un fichero con permisos rwx-rw-r-x no lo cumpliría.
Es decir, este fichero tiene permisos 755 como vemos. El mismo resultado utilizando permisos en representación simbólica:
-perm {+modo}: buscaremos ficheros que coincidan exactamente con los permisos o que al menos tengan estos permisos el propietario ó el grupo ó el resto en representación octal o en representación simbólica. Por ejemplo: +111: lo cumplirían archivos que tuvieran --x--x--x al menos. Si tienen más permisos, también cumplirían la condición. Un fichero con permisos --x------ saldría en el resultado. Un ficheros con permisos rw-r--r-- no saldría en el resultado.
Vemos que el fichero tiene permisos 644. Por ejemplo, sería lo mismo esta sentencia:
Con esta
-size {n} [ckMG]: buscamos los ficheros que tengan como tamaño de bloque el valor n, es decir, el número bloques que utiliza el fichero en disco. Un bloque por defecto son 512 bytes, pero desafortunadamente no tiene porqué serlo. Es recomendable buscar por unidades de almacenamiento que son las siguientes: · c= bytes. · k= kilobytes. · M= Megabytes. · G= GigaBytes. Ejemplos:
Buscará ficheros cuyos tamaños sean exactamente de 40 bytes.
Buscará ficheros cuyos tamaños sean menos de 24 Megabytes.
Buscará ficheros cuyos tamaños sean mayores de 46 kilobytes. -type {tipo}: especificamos el tipo de fichero a buscar · -d: directorio · -f: fichero regular · -l: enlace simbólicos · -b: fichero especial de bloques* · -c: fichero especial de caracteres*
-uid {n}: busca ficheros cuyo propietario tenga el uid especificado. -user {usuario}: busca fichero cuyo propietario del mismo es el usuario. 3.4. Acciones-exec {orden}: ejecutar una orden sobre el resultado de la búsqueda. Utilizamos esta acción seguida de un espacio y el comando a ejecutar sobre el valor devuelto por find y después {} ; La cadena {} se reemplaza por los fichero(s) encontrado(s). Sintaxis: find ..... -exec accion_a_realizar {} ; Se verán ejemplos detallados en la sección Ejemplos. -ls: la salida de find es un listado idéntico al formato utilizado por este comando. -print: muestra el nombre completo de los ficheros encontrados por la salida estándar, seguido de un salto de línea. Find lleva implícita esta acción por defecto. Si la expresión no contiene ninguna acción (excepto -prune), se aplica por omisión la acción -print siempre que la expresión devuelve verdadero (ó 0). -print0: igual que print0 pero sustituye el salto de línea por un carácter nulo. -fprint {fichero}: escribe el resultado de la búsqueda en el fichero indicado, incluyendo un salto de línea por cada fichero encontrado. -fprint0 {fichero}: igual que fprint pero sustituye salto de línea por carácter nulo. -fls {fichero}: escribe en el fichero seleccionado el resultado de la busqueda con formato de salida idéntico al comando ls. -printf {formato}: imprime el resultado en la salida estándar con el formato indicado. El formato utiliza secuencias de escape y directivas. Es aconsejable utilizar la ayuda en línea (man find) para ver la gran cantidad de opciones. Se ven algunos ejemplos en la sección Ejemplos. -fprintf {fichero} {formato}: igual que printf pero escribe el resultado de la búsqueda en el fichero indicado. 3.5. OperadoresLas búsquedas pueden ser a veces complejas, con expresiones extensas. Podemos utilizar operadores para combinar expresiones.
4. Acciones sobre el resultadoComo se ha mencionado antes, -exec se aplica para ejecutar una determinada acción sobre el resultado de la busqueda devuelto por find. Pues bien, existe otra instrucción cuya finalidad es la misma pero con una sintaxis y funcionamiento diferentes, xargs. Sintaxis xargs: find ..... | xarg [opciones] orden Opciones:
Esta opción deberá usarse cuando utilicemos la acción print0 con find.
La cadena {} se reemplaza por el resultado devuelto por find, en este caso 1.log..
Para más opciones mirar la ayuda en línea (man xargs). Entonces, ¿cual elegir?... 4.1. Diferencias entre xarg y execFundamentalmente las diferencias son las siguientes:
Respecto a la primera diferencia, pues es acostumbrarse a una sintaxis u otra, y respecto a la segunda, esta es definitiva porque es mucho más rápido el parámetro xarg. Para comprobarlo bastaría con ejecutar:
Resulta evidente la diferencia de tiempo. 5. Ejemplos comunesLos criterios de búsqueda más comunes podrían ser:
Después de realizar estas búsquedas, podemos ejecutar estas acciones típicas como:
6. Ejemplos variadosLa mejor manera de aprender a utilizar este comando es ver, comprender y practicar con todo tipo de ejemplos. Cuanto mas variados mejor. Los vemos:
Como se ha descrito antes, los argumentos numéricos son:
Como recordatorio, la opción -atime se refiere al tiempo transcurrido desde la última lectura, -mtime el tiempo transcurrido desde última modificación de los permisos y, -ctime al tiempo transcurrido desde la última modificación del contenido.
y con xargs:
Ignorar mensajes de error. Por ejemplo, buscamos los ficheros de nombre passwd en /etc y los imprimimos por pantalla:
Como vemos, a veces aparecen mensajes de error de acceso en el listado resultante. Esto se debe a que el usuario con el que ejecutamos el comando find no tiene permisos de acceso, lectura sobre ficheros y ejecución sobre directorios. Para evitar estos mensajes, redireccionamos los errores (2>) a la "papelera de Linux" (/dev/null), en vez de verlos por la salida estándar (que es la pantalla, la opción por defecto). Lo vemos:
Otra solución es ejecutar find como root, sólo aconsejable para tareas de administración.
ó
*--target-directory: el valor de este parámetro es la ruta donde se encuentra la imagen encontrada. Esta sentencia haría lo mismo:
El formato de la acción -printf en este caso es:
* Para ver todos los formatos de -printf mirar ayuda en línea.
7. Referencias
|