8.3.3.8. Órdenes de búsqueda

Linux nos ofrece una herramienta muy potente para realizar búsquedas en el Sistema de Ficheros: la orden find. Esta orden necesita que le pasemos como argumentos el directorio donde deseamos hacer la búsqueda y una expresión que se refiera a lo que queremos buscar. Para dicha expresión tenemos varias opciones:

  • -name se refiere al nombre del fichero que queremos buscar. Después de poner -name debemos indicar entre comillas una expresión referida al nombre del fichero que estamos buscando. Dicha expresión distinguirá mayúsculas y minúsculas. Por ejemplo, find / -name "*.conf" buscará todos los ficheros que acaben en .conf y estén situados en el directorio raíz o sus subdirectorios. Para la expresión del nombre del fichero que buscamos podemos utilizar los metacaracteres que ya conocemos.
  • -iname es igual a la anterior pero no distingue entre mayúsculas y minúsculas.
  • -maxdepth sirve para indicarle la profundidad en subdirectorios a la que queremos buscar. Por ejemplo, find / -maxdepth 2 buscará en el directorio raíz y sus subdirectorios directos, pero no más allá.
  • -size [+-]X[ckMG] permite hacer búsquedas por el tamaño de fichero. Como vemos, se admiten varias opciones en la expresión. Puede empezar por +, lo cual indicará que buscamos ficheros que sean mayores de cierto tamaño, o por -, con lo que estaremos buscando ficheros cuyo tamaño sea menor al especificado. Después del signo se debe poner una cantidad y seguidamente c (referido a bytes), k (referido a kilobytes), M (referido a Megabytes) o G (referido a Gigabytes). Por ejemplo, si queremos buscar un fichero que ocupe más de 10MB y menos de 1GB tendríamos que poner find / -size +10M -size -1G.
  • -type [dfl] busca por tipo de fichero, pudiendo especificar si buscamos directorios (d), ficheros normales (f) o enlaces simbólicos (l). Por ejemplo, si queremos buscar directorios en /etc debemos hacer find /etc -type d.
  • -samefile busca enlaces duros al fichero que le pasemos como expresión. Por ejemplo, si queremos saber todos los enlaces duros que tiene el fichero texto.txt del directorio actual deberemos hacer find / -samefile texto.txt. No buscamos en el directorio actual, sino en el directorio raíz, para así encontrar todos los enlaces duros que haya en cualquiera de los directorios del sistema de ficheros.
  • -user permite buscar ficheros que pertenecen a determinado usuario. Por ejemplo, si queremos ver los ficheros que pertenecen al usuario alumno debemos ejecutar find / -user alumno.
  • -group permite buscar ficheros que pertenecen a determinado grupo. Por ejemplo, si queremos buscar ficheros que pertenezcan al grupo root haremos find / -group root.
  • -amin X busca ficheros cuya fecha de último acceso sea de hace X minutos. Si el número va precedido de un + buscamos ficheros que hayan sido accedidos hace más de X minutos. Si va precedido de un - lo que buscamos son ficheros que hayan sido accedidos hace menos de X minutos. Si no ponemos ni + ni - buscamos ficheros que hayan sido accedidos hace exactamente X minutos. Por ejemplo, para ficheros que hayan sido accedidos en los últimos 5 minutos find / -amin -5.
  • -atime X busca ficheros cuya fecha de último acceso sea de hace X días. Si el número va precedido de un + buscamos ficheros que hayan sido accedidos hace más de X días. Si va precedido de un - lo que buscamos son ficheros que hayan sido accedidos hace menos de X días. Si no ponemos ni + ni - buscamos ficheros que hayan sido accedidos hace exactamente X días. Por ejemplo, para ficheros que hayan sido accedidos en los últimos 5 días find / -atime -5.
  • -cmin X busca ficheros cuya fecha de último cambio de estado sea de hace X minutos. Si el número va precedido de un + buscamos ficheros que hayan cambiado de estado hace más de X minutos. Si va precedido de un - lo que buscamos son ficheros que hayan cambiado de estado hace menos de X minutos. Si no ponemos ni + ni - buscamos ficheros que hayan cambiado de estado hace exactamente X minutos. Por ejemplo, para ficheros que hayan cambiado de estado hace más de 30 minutos find / -cmin +30.
  • -ctime X busca ficheros cuya fecha de último cambio de estado sea de hace X días. Si el número va precedido de un + buscamos ficheros que hayan cambiado de estado hace más de X días. Si va precedido de un - lo que buscamos son ficheros que hayan cambiado de estado hace menos de X días. Si no ponemos ni + ni - buscamos ficheros que hayan cambiado de estado hace exactamente X días. Por ejemplo, para ficheros que hayan cambiado de estado hace más de 1 mes find / -ctime +30.
  • -mmin X busca ficheros cuya fecha de última modificación sea de hace X minutos. Si el número va precedido de un + buscamos ficheros que hayan sido modificados hace más de X minutos. Si va precedido de un - lo que buscamos son ficheros que hayan sido modificados hace menos de X minutos. Si no ponemos ni + ni - buscamos ficheros que hayan sido modificados hace exactamente X minutos. Por ejemplo, para ficheros que hayan sido modificados hace exactamente 1 minuto find / -mmin 1.
  • -mtime X busca ficheros cuya fecha de última modificación sea de hace X días. Si el número va precedido de un + buscamos ficheros que hayan sido modificados hace más de X días. Si va precedido de un - lo que buscamos son ficheros que hayan sido modificados hace menos de X días. Si no ponemos ni + ni - buscamos ficheros que hayan sido modificados hace exactamente X días. Por ejemplo, para ficheros que hayan sido modificados hace exactamente 1 año find / -mtime 365.
  • -newer se refiere a ficheros que hayan sido modificados más recientemente que un fichero determinado. Por ejemplo, si queremos saber que ficheros se han modificado más recientemente que /etc/sos.conf tendremos find / -newer /etc/sos.conf.

En Linux también disponemos de un comando para ordenar listas denominado sort. Su principal cometido es ordenar las líneas de texto que se le pasen como argumento según distintos criterios. Por defecto las ordena por orden alfabético pero hay más criterios:

  • sort -n usa un orden numérico. Por ejemplo, si queremos ver los contenidos del directorio actual ordenados por su tamaño podemos hacer ls -s | sort -n. Como vemos, la utilidad de sort viene al concatenarlo con otros comandos como por ejemplo ls o find. En este caso usamos ls -s para listar los contenidos del directorio actual precedidos de su tamaño y con la barra | decimos que el resultado de ejecutar ese ls -s se le debe pasar a sort -n como argumento. Por su parte, sort -n ordena numéricamente lo que se le ha pasado, por lo que realmente está ordenando el contenido del directorio actual de menor a mayor tamaño de fichero.
  • sort -r ordena los resultados en orden inverso. Por ejemplo, para ordenar los contenidos del directorio actual en orden inverso podríamos hacer ls | sort -r.
  • sort -f ordena alfabéticamente ignorando las mayúsculas y minúsculas.

La orden sort también es muy útil para ordenar los resultados de las búsquedas que se realizan con find.

 

Para buscar dentro de ficheros de texto disponemos de la orden grep. También es muy útil para buscar entre los resultados de un find o de un ls. Esta orden busca dentro de los ficheros las líneas que coincidan con el patrón de búsqueda especificado. Para especificar dicho patrón de búsqueda podemos recurrir a los metacaracteres que ya conocemos. Algunas de sus opciones son:

  • -número Las líneas concordantes se mostrarán acompañadas del número especificado de líneas anteriores y posteriores.
  • -A X Muestra X líneas de contexto después de las que concuerden con el patrón.
  • -B X Muestra X líneas de contexto antes de las que concuerden con el patrón.
  • -c En lugar de mostrar el contenido de las líneas que conciden con el patrón de búsqueda muestra el número de líneas que concuerdan con el patrón para cada fichero de entrada.
  • -h Suprime la impresión de los nombres de ficheros antes de las líneas concordantes en la salida, cuando se busca en varios ficheros.
  • -i No hace caso de si las letras son mayúsculas o minúsculas ni en el patrón ni en los ficheros de entrada.
  • -L Suprime la salida normal. En su lugar muestra el nombre de cada fichero de entrada donde no se encuentre ninguna concordancia y por lo tanto de cada fichero que no produciría ninguna salida. La búsqueda se detendrá al llegar a la primera concordancia.
  • -l Suprime la salida normal. En su lugar muestra el nombre de cada fichero de entrada que produciría alguna salida. La búsqueda se detendrá en la primera concordancia.
  • -n Prefija cada línea de salida con el número de línea de su fichero de entrada correspondiente.
  • -q Modo silencioso; suprime la salida normal. La búsqueda finaliza en la primera concordancia.
  • -v Invierte el sentido de la concordancia, para seleccionar las líneas donde no hay coincidencias con el patrón.
  • -w Selecciona solamente aquellas líneas que contienen concordancias que forman palabras completas.
  • -x Selecciona solamente aquellas concordancias que constan de toda la línea.

 

Como hemos dicho antes, el comando grep es muy útil para buscar entre los resultados de un ls o de una búsqueda con find. Esto se hace concatenando la salida de ls o find con la entrada de grep mediante la barra vertical |. Por ejemplo, para buscar entre el contenido del directorio actual todos los ficheros o directorios cuya fecha sea de 2010 podemos hacer ls -l | grep 2010. También podemos concatenar varios comandos grep para afinar más la búsqueda, por ejemplo buscando solo los que sean de junio de dicho año: ls -l | grep 2010 | grep Jun.

Icono IDevice Actividades

Actividad 1. Busca en el directorio /etc, y sólo en ese directorio, todos los ficheros cuyo tamaño sea mayor de 10KB.

Actividad 2. Busca en /bin todos los ficheros que comiencen por mk.

Actividad 3. Busca en /etc todos los ficheros que hayan sido modificados en la última semana.

Actividad 4. Busca en /etc todos los ficheros que sean más nuevos que el fichero profile.

Actividad 5. Busca en /etc todos los ficheros que pertenezcan al usuario root y ocupen entre 1KB y 10KB y ordena el resultado de la búsqueda en orden alfabético inverso.

Actividad 6. Muestra todos los ficheros de /etc cuya fecha sea de 2008.

Actividad 7. Busca en /etc todos los directorios que contiene, pero en lugar de mostrarlos haz que se muestre cuántos contienen una d.