Buscar en el terminal

A menos que seas una persona muy ordenada y tengas los archivos en tu equipo perfectamente clasificados, lo mas normal es que termines buscando. Si, probablemente, como comenté en el artículo sobre Catfish, un buscador gráfico para Ubuntu, una de las operaciones mas habituales que realizamos con nuestro equipo es buscar. En este artículo, vamos a hacer lo mismo que con Catfish, pero en el terminal. Es decir, vamos a buscar en el terminal.

Para buscar en el terminal utilizaremos find, y es precisamente a esta herramienta a la que vamos a dedicar este artículo. Por que, como veremos, no solo nos permite buscar con todo detalle cualquier archivo o directorio. También nos permite realizar acciones con lo que hemos encontrado. Esto, como veremos en el artículo, nos va abrir un abanico de posibilidades.

Si embargo, si eres de los que todavía no se atreven con el terminal, porque eres relativamente nuevo, o porque simplemente piensas que no es para ti, te recomiendo que pruebes Catfish.

Buscar en el terminal

Buscar en el terminal

find o como buscar en el terminal

find es una herramienta disponible para el terminal con el podemos realizar búsquedas en uno o mas directorios de nuestro sistema de archivos. Estas búsquedas las podemos realizar siguiendo diferentes criterios establecidos por nosotros mismos. Y además, con los archivos o directorios encontrados podemos realizar acciones.

Existen diferentes criterios para buscar y localizar archivos y directorios. Desde patrones para buscar por el nombre, hasta rangos de fechas para buscar aquellos archivos que hemos modificado o accedido en el periodo indicado.

find en profundidad

El uso de find es como sigue,

find [-H] [-L] [-P] [-D debugopts] [-Olevel] [punto de inicio] [expresion]

El punto de inicio se refiere a donde vamos a empezar a buscar. Así, por ejemplo si queremos empezar a buscar el directorio en el que nos encontramos, ejecutaremos,

find .

Las opciones -H, -L y -P son las que indicarán a find como tratar con los enlaces simbólicos. En concreto,

  • -H. Ignora los enlaces simbólicos, excepto aquellos definidos en los argumentos.
  • -L. Sigue los enlaces simbólicos.
  • -P. Ignora los enlaces simbólicos. Este es el comportamiento por defecto.

La opción -D sirve para que find nos informe de lo que sucede. Es útil, en particular para localizar algún problema con la ejecución de la función. Así, tiene algunas opciones adicionales que nos pueden ayudar en esa investigación. Para ver todas las posibilidades, ejecuta find -D help.

La opción -Olevel habilita la optimización de nuestra consulta. De esta manera find reordenará los filtros para acelerar el proceso preservando el funcionamiento esperado.

Condiciones

Las condiciones son todos aquellos requerimientos que debe cumplir un archivo o directorio para que esté dentro de lo que estamos buscando. No voy a citarlos todos, pero si aquellos mas interesantes (al menos para mi),

  • -name patron selecciona aquellos archivos que cumplen con un determinado patron. La búsqueda distingue entre mayúsculas y minúsculas. Por supuesto el patrón admite los comodines *, ? y []. Por ejemplo, si tenemos un directorio con los siguientes archivos,
Ejemplo01.txt
Ejemplo02.txt
Ejemplo03.txt

find . -name "Ejemplo*.txt" nos devolverá todos los archivos.
find . -name "ejemplo*.txt" no nos devolverá nada.
find . -name "Ejemplo0?.txt" nos devolverá todos los archivos.
find . -name "Ejemplo0[1-2].txt" nos devolverá los dos primeros archivos.

  • -iname patron. Funciona exactamente igual que el anterior, pero es insensible a mayúsculas y minúsculas. Así por ejemplo en el caso anterior,

find . -iname "ejemplo*.txt" nos devolverá todos los archivos.

  • -path patron. El funcionamiento es similar al de name, pero para toda la ruta. No solo para el nombre del archivo o el directorio, sino en toda la ruta. Por ejemplo,

find /home/ -path "*/src/*"

Buscará todos los archivos en cuya ruta nos encontremos con /src/.

  • -ipath patron. Lo mismo que en el caso anterior, pero sin distinguir entre mayúsculas y minúsculas.
  • -type X. El tipo de elemento que estamos buscando. Así para directorios -type d, para archivos -type f y para enlaces simbólicos -type l. Existen mas tipos, pero estos son los que utilizo.
  • -amin n y -amin +n. Archivos o directorios que tuvieron acceso hace n minutos o al menos hace n minutos.
  • -atime n y -atime +n. Archivos o directorios que tuvieron acceso hace n días o al menos hace n días.
  • -cmin n y -cmin +n. Archivos o directorios cuyo estado fue modificado hace n minutos o al menos hace n minutos.
  • -ctime n y -ctime +n. Archivos o directorios cuyo estado fue modificado hace n días o al menos hace n días.
  • -mmin n y -mmin +n. Archivos o directorios que fueron modificados hace n minutos o al menos hace n minutos.
  • -mtime n y -mtime +n. Archivos o directorios que fueron modificados hace n días o al menos hace n días. Si utilizamos - nos devolverá aquellos archivos o directorios modificados hace menos de n días.

+n busca valores mayor que n
-n busca valores menor que n
n busca exactamente el valor n

  • -perm XXX. Archivos o directorios que tienen exactamente esos permisos.
  • -perm -XXX. Archivos o directorios que tienen al menos esos permisos.
  • -perm /XXX. Archivos o directorios que tienen alguno de esos permisos.
  • -group nombre_del_grupo. Archivos o directorios que pertenecen al grupo nombre_del_grupo.
  • -user nombre_del_usuario. Archivos o directorios que pertenecen al usuario nombre_del_usuario.
  • -executable. Archivos que son ejecutables o directorios que son accesibles por el usuario.
  • -readeable. Archivos o directorios para los que el usuario tiene permiso de lectura.
  • -writeable. Archivos o directorios para los que el usuario tiene permiso de escritura.
  • -size n[kMG] o -size +n[kMG]. Archivos que tienen exactamente un tamaño de nk KiB, nM MiB o nG GiB. O en su segunda forma, que tienen al menos un tamaño de de nk KiB (1024 bytes), nM MiB (1024*1024 bytes) o nG GiB (1024x1024x1024 bytes).
  • -maxdepth n limita la profundidad de la búsqueda a n niveles.

Acciones

Las acciones definen que es lo que vamos a hacer con los archivos que hemos encontrado según las condiciones establecidas.

  • -delete. Borra los archivos.
  • -exec orden {} \;. Ejecuta la orden para cada uno de los archivos encontrados.
  • -ls. Lista con el formato ls -dils.
  • -fls archivo. Lo mismo que -ls pero lo guarda en el archivo indicado.

Operadores

Nos permite concatenar condiciones,

  • ! condicion ó `not condicion. Niega la condición establecida.
  • condicion1 condicion2 ó condicion1 -a condicion2 ó condicion1 -and condicion2. Se deben cumplir ambas condiciones.
  • condicion1 -o condicion2ócondicion1 -or condicion2`. Se debe cumplir una de las dos condiciones.

Algunas recetas…

  • Buscar en el terminal todos los archivos modificados en la última hora,

find /var/log/ -type f -mmin -60

  • Buscar todos los archivos que tengan un tamaño de mas de 50MiB

find ~/Descargas/ -type f -size +50M

  • Buscar en el terminal archivos que están en un rango determinado,

find ~/Descargas/ -type f -size +50M -size -100M

  • Buscar y borrar todos los archivos que tengan un tamaño de mas de 50MiB

find ~/Descargas/ -type f -size +50M -delete

  • Para encontrar archivos vacíos

find /tmp -type f -empty

  • Para encontrar directorios vacíos,

find /tmp -type d -empty

  • Para mover todos los archivos de mas de 1GiB a un directorio archivos grandes, pero te preguntará en cada ocasión si lo mueve o no, y en función de tu respuesta actuará,

find . -size +1G -ok mv '{}' ~/archivosgrandes \;

  • Cambiar el permiso de todos los archivos,

find . -type f -exec chmod 664 {} \;

  • Cambiar el permiso de todos los directorios,

find . -type d -exec chmod 775 {} \;

Conclusiones

find de por si ya es una herramienta espectacular para simplemente buscar en el terminal. Pero si además la combinamos con la opción -exec las posibilidades que te ofrece son espectaculares.

Te recomiendo que le des un vistazo, y le dediques algo de tiempo a comprenderla a fondo, porque te va a solucionar mas de un problema. Esta herramienta te permite simplificar las tareas sensiblemente.


Más información,

3 comentarios en “Buscar en el terminal

  1. Víctor Manuel Sereno hace 4 años

    Me ha parecido un artículo muy útil, con tu permiso me lo voy a imprimir para tenerlo de referencia, en mis apuntes no se detalla tanto. Como siempre un trabajo excelente. Gracias.

    1. El atareao hace 4 años

      Muchas gracias Víctor. La verdad es que llevo algún tiempo persiguiendo escribir este artículo, porque últimamente estoy haciendo mucho uso de esta herramienta.
      Gracias y un saludo.

  2. Aquí van algunas recetas más…
    find /-user 1000 (localiza todos los archivos del primer usuario normal)
    find . -type f -perm 0777 -print (buscará en el directorio actual todos los ficheros con permiso 777)
    find / -type f ! -perm 777 (buscará todos los ficheros que NO tengan el permiso 777)
    find / -perm 2644 (busca todos los ficheros con el bit SGID con permiso 644)
    find / -perm 1551 (busca todos los ficheros con el Sticky bit con permiso 551)
    find . -type f -name «borrador.txt» -exec rm -f {} ; (busca ese fichero y lo remueve)
    find ~ -type f -exec ls -s {} ; | sort -n (lista los ficheros más grandes dentro de todas las carpetas)
    find . -name «.*» (buscará ficheros ocultos)
    find /dir/ -type f -not -name ‘Protec’ -delete (borra todo lo que hay en el directorio, excepto el fichero llamdo ‘Protec’)

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *