El comando find de Linux es una potente herramienta que permite a los administradores del sistema localizar y gestionar archivos y directorios basándose en una amplia gama de criterios de búsqueda. Puede encontrar directorios y archivos por su nombre, su tipo o extensión, tamaño, permisos, etc.

Además de localizar archivos y directorios, la combinación del comando find con otros le permite realizar acciones sobre los resultados. Añadir la opción -exec permite a los administradores de sistemas ejecutar comandos externos y realizar acciones como copiar, mover, eliminar o cambiar los permisos de los archivos que coincidan con los criterios especificados, como el tamaño, el nombre, etc.

En este artículo, comenzaremos explicando los comandos find básicos de Linux con ejemplos. Esto le mostrará cómo encontrar archivos y directorios. A continuación, le mostraremos cómo utilizar la opción -exec para actuar sobre los archivos o directorios en función de su tamaño, permisos, etc.

La sintaxis general del comando find es

find {ruta} {nombre -del-archivo o dir-a-buscar} {acción a tomar}

Donde,

  • ruta especifica el directorio
  • nombre-del-archivo o directorio-a-buscar : Nombre del archivo o directorio a buscar
  • acción-a-tomar: como copiar, borrar, mover, etc.

En este tutorial, explicaremos cómo localizar archivos y directorios que coincidan con patrones especificados. También veremos cómo realizar acciones sobre los archivos o directorios que localiza el comando find. La guía está basada en Ubuntu pero es aplicable a la mayoría de distribuciones y versiones de Linux.

Encontrar archivos y directorios

Buscar archivos específicos por nombre o extensión

Para buscar un archivo específico, ejecute el siguiente comando desde la raíz (/). El comando contiene el nombre exacto del archivo que está buscando.

buscar . -nombre archivo22.txt

Salida

./test/fichero22.txt
./ventas/archivo22.txt

Tenga en cuenta que los resultados incluyen la ruta. Esto es importante si no conoce el directorio en el que se encuentra el archivo, o cuando se encuentra en más de un lugar.

También puede buscar el archivo en otro directorio mientras sigue en la ubicación actual. En este caso, debe proporcionar la ruta del directorio en el que desea buscar.

find ./prueba -nombre archivo22.txt

Buscar archivos específicos en otro directorio

En nuestro caso, buscaremos todos los que empiecen por las letras file en el directorio test.

find ./prueba -nombre archivo*

Salida

./prueba/archivo22.txt
./test/archivo30.doc
./test/fichero1.txt
./prueba/archivo5,doc

Buscar archivos por extensión

Para buscar un archivo en Linux con una extensión determinada, añádala al comando

buscar . -nombre *.txt

Salida

./prueba/subprueba/subarchivo.txt
./prueba/archivo22.txt
./prueba/archivo1.txt
./home1/fichero32.txt
./home2/fichero22.txt
./qa/etiquetas.txt

Buscar archivos y directorios por nombre

Utilice el siguiente comando para buscar archivos y directorios que empiecen por las letras qa. En nuestro ordenador, tenemos los archivos qatree.txt y qa.txt, así como un directorio con el nombre qa.

Si ejecutamos el comando

find ./ -name "qa*"

Nos devuelve la siguiente salida

./test/qatree.pdf
./test/qa.txt
./home/qa

El comando devuelve tanto los archivos como los directorios que coinciden con los criterios de búsqueda. Para buscar sólo archivos o directorios, debe especificarlo en la orden.

Buscar sólo archivos o directorios

Para buscar sólo archivos, utilice el modificador type f.

Sólo archivos

find ./ -type f -name "qa*"

Salida

./test/qatree.pdf
./test/qa.txt

Sólo directorios

Añada la opción de tipo d para localizar sólo directorios.

find ./ -type d -name "qa*"

Salida

./home/qa

Comando find que no distingue mayúsculas de minúsculas

Todas las búsquedas con el modificador -nombre distinguen entre mayúsculas y minúsculas y no darán resultados con mayúsculas. Para obtener todos los casos, utilice la opción -iname.

find ./ -iname "qa*"

Salida

./test/qatree.pdf
./test/qa.txt
./test/QAtest.txt
./home/qa

Buscar un archivo en varios directorios

Para buscar los archivos en diferentes directorios, añada sus rutas en el comando. En nuestro caso, buscaremos en los directorios test y numeric.

find ./test ./numeric -name fichero22.txt -type f

Salida

./test/fichero22.txt
/root/numeric/fichero22.txt

Encontrar varios archivos con diferentes extensiones de todos los directorios

Puede utilizar el comando find para localizar múltiples archivos que compartan las diferentes extensiones como *.doc, *.txt *.pdf, etc. Esto puede hacerse por separado, una extensión cada vez, o utilizando un solo comando que incluya todas las extensiones deseadas.

buscar . -tipo f ( -nombre "*.txt" -o -nombre "*.pdf" -o -nombre "*.doc" )

salida

./prueba/subprueba/subfil.txt
./prueba/qatree.pdf
./prueba/archivo22.txt
./test/qa.txt
./test/archivo30.doc
./libros/acro.pdf
./datos1/archivo22.txt
./docs/fichero32.txt

Buscar archivos que contengan un texto determinado

A veces, desea acceder a un archivo que contiene cierto texto pero no puede recordar su nombre o ubicación. Este comando le permite encontrar todos los archivos que contengan el texto deseado.

Para buscar todos los archivos que contengan la palabra hiperconvergencia», utilice

find / -type f -exec grep -l -i "hiperconvergencia" {} ;

Salida

/root/numérico/hci
/root/HCIP

La opción -i permite al comando ignorar mayúsculas y minúsculas y encontrará el texto tanto si está en mayúsculas como si no, es decir, hiperconvergencia, Hyperconvergence , etc.

Para buscar los archivos en un directorio específico, basta con añadirlo a la orden

find ./numeric -type f -exec grep -l -i "hiperconvergencia" {} ;

Salida

./numérico/hci

Explore más ejemplos del comando grep.

Buscar archivos y directorios en función de su tamaño

Puede encontrar todos los archivos o directorios que sean menores, iguales o mayores que un determinado tamaño, que estén dentro de un determinado rango o que estén vacíos. Utilice el formato de tamaño adecuado en función del tipo de archivos o directorios que esté buscando.

Las opciones de tamaño incluyen;

c – bytes

k – kilobytes

M – Megabytes

G – Gigabytes

Buscar archivos de un tamaño determinado – igual a 30MB

Para buscar encontrar todos los archivos de 30MB

buscar / -tamaño 30M

Encontrar archivos mayores de un tamaño especificado

encontrar -tamaño 2M

Salida

. /Descargas/ubuntu18043.iso 
./.cache/pip/http/6/e/3/8/3/6e38383f41850c3e5705d48116bc52f81b92a80500f414305057 7a9c

Buscar archivos de menos de 10 MB en el directorio actual

encontrar . -tipo f -tamaño -10M

Encontrar archivos con tamaños entre 100-200MB

Cuando busque archivos dentro de un rango específico como entre 100 y 200 MB

find / -tamaño 100M -tamaño -200M

Buscar directorios de más de 20kb

find / -type d -size 20k

Busca archivos y directorios vacíos.

Archivos

find ./ -type f -size 0

o

find ./ -type f -empty

Directorios

find ./ -type d -empty

Encontrar archivos por antigüedad o tiempo de modificación

Encontrar archivos con más de n días de antigüedad

find /ruta/ -type f -name '*.txt' -mtime 8

La opción -mtime 8 buscará los archivos txt que tengan más de 8 días de antigüedad.

Por fecha de modificación

Esto buscará los archivos modificados en las últimas 17 horas

buscar . -mtime -17 -type f 

Busca directorios modificados en los últimos 10 días

buscar . -mtime -10 -type d 

Busca archivos en función de su acceso o modificación

Buscar archivos basándose en la fecha o la hora de acceso. Esto le permite ver los archivos a los que se ha accedido o no dentro de un periodo especificado.

Para ver los archivos a los que no se ha accedido en los últimos 10 días en el directorio home

find /home -atime 10

Archivos a los que se accedió hace exactamente 10 días

find /home -atime 10

A los que se ha accedido en los últimos 10 días

find /home -atime -10

Buscar archivos modificados en los últimos n días

También puede buscar los archivos del directorio /home modificados en los últimos 10 días utilizando el comando

find /home -mtime -10 

Buscar archivos modificados en un periodo determinado

Por ejemplo, todos los ficheros modificados hace entre 6 y 15 días en el directorio home.

find /home -type f -mtime 6 -mtime -15

Archivos y directorios a los que se ha accedido en los últimos 10 minutos

Para encontrar los archivos a los que se ha accedido en los últimos 10 minutos, utilice la opción -amin.

find . -amin -10 -tipo f

Salida

./.bash_history
./.profileroot@ubuntu1804:~#

Directorios a los que se ha accedido en los últimos 10 minutos

find . -amin -10 -type d

Encontrar archivos que coincidan con permisos específicos

Sintaxis

$ find -perm modo

Donde mode es el permiso que puede ser numérico como 644, 655, 700, 777, etc, o letras como u=x, a=r x, etc.

Puede especificar el modo de las tres formas siguientes.

  1. Sin prefijo cuando desee encontrar archivos con los permisos exactos especificados.
  2. Con «-» para archivos con al menos el permiso especificado. Esto devuelve archivos con el permiso especificado así como con permisos adicionales superiores.
  3. Utilizando «/» se requiere especificar el propietario o grupo con el permiso del fichero.

Buscar archivos con permiso 777

find -perm 777

Salida

./archivo1

Encontrar archivos con al menos 766
find -perm -766

Salida

./archivo2
./archivo1

El comando busca todos los archivos en los que

  • El propietario del archivo tiene permisos de lectura/escritura/ejecución.
  • El grupo tiene permisos de lectura/escritura
  • Otros tienen permiso de lectura/escritura

Como tal, devuelve dos archivos que cumplen este criterio: archivo1 y archivo2. No es necesario que los archivos tengan los 766 permisos exactos y pueden tener otros adicionales siempre y cuando pero deben tener al menos los especificados.

Buscar archivos con permiso de escritura del propietario

Ahora utilizaremos la «/» para buscar archivos escribibles por su propietario, o grupo, u otros.

find -perm /222
.
./archivo2
./archivo3
./archivo1

Lo anterior busca archivos que puedan ser escritos por su propietario o por su grupo.
Esto devuelve archivos que son escribibles por cualquiera de los dos pero no necesariamente por ambos. Para ver archivos en los que ambos tienen permisos de escritura, utilice el prefijo -.

find -perm -220

Salida

./archivo2
./archivo1

Encontrar archivos propiedad de un usuario

Encontrar todos los archivos propiedad de Jack

find /home -usuario jack

Salida

/home/jack
/home/jack/ejemplos.escritorio
/home/jack/.gnupg
/home/jack/.gnupg/llaves-privadas-v1.d
/home/jack/ans.cgi

Encontrar archivos específicos propiedad de un usuario

Encontrar todos los archivos de texto propiedad de Jack

find /home -user jack -iname "*.txt"

Salida

/home/jack/docs/archivo32.txt

Encontrar y listar archivos y directorios junto con sus permisos

find -name "*.conf" | ls -l

Salida

total 120
drwxr-xr-x 2 raíz root 4096 31 dic 13:19 backup2
drwxr-xr-x 2 raíz root 4096 Ene 4 11:57 Escritorio
drwxr-xr-x 2 raíz raíz 4096 31 dic 11:50 Documentos
drwxr-xr-x 2 root root 4096 Dic 31 12:27 Descargas
-rw-r--r-- 1 root root 0 Ene 4 12:02 archivo22.doc
drwxr-xr-x 2 root raíz 4096 Ene 4 12:14 archivo23
-rw-r--r-- 1 root root 0 Ene 4 12:23 archivo23.txt

Busque los resultados y actúe en consecuencia

En esta sección, veremos cómo puede actuar sobre los archivos que coinciden con el patrón especificado en el comando find.

Encontrar archivos y cambiar permisos

Encuentre y cambie los permisos de ciertos tipos de archivos. En nuestro caso, trabajaremos con archivos PHP con diferentes permisos como se muestra a continuación.

jack@ubuntu1804:~/ver$ ls -la

total 8
drwxrwxr-x 2 jack jack 4096 Ene 3 14:11 .
drwxr-xr-x 8 jack jack 4096 Ene 3 14:05 ..
-rwxr-xr-x 1 jack jack 0 Ene 3 14:06 ans.php
-rw-rw-r-- 1 jack jack 0 Ene 3 14:11 base.php
-rwxr-xr-x 1 jack jack 0 Ene 3 14:06 query.php
-rw-rw-r-- 1 jack jack 0 Ene 3 14:11 qust.php
-rwxr-xr-x 1 jack jack 0 Ene 3 14:06 text.php
-rw-rw-r-- 1 jack jack 0 Ene 3 14:11 vary.php

Ahora buscaremos todos los archivos PHP (arriba) y sustituiremos sus permisos por 755

find ver -name "*.php" -type f -exec chmod 755 {} ;

El comando busca los archivos PHP en el directorio ver y luego establece su permiso en 755(rwxr-xr-x)

Resultados

jack@ubuntu1804:~/ver$ ls -la
total 8
drwxrwxr-x 2 jack jack 4096 3 Ene 14:11 .
drwxr-xr-x 8 jack jack 4096 Ene 3 14:05 ..
-rwxr-xr-x 1 jack jack 0 Ene 3 14:06 ans.php
-rwxr-xr-x 1 jack jack 0 Ene 3 14:11 base.php
-rwxr-xr-x 1 jack jack 0 Ene 3 14:06 query.php
-rwxr-xr-x 1 jack jack 0 Ene 3 14:11 qust.php
-rwxr-xr-x 1 jack jack 0 Ene 3 14:06 text.php
-rwxr-xr-x 1 jack jack 0 Ene 3 14:11 vary.php

Buscar y cambiar permisos de archivos y directorios

Encuentre archivos con permisos 644 y cámbielos para que tengan permisos 655

encontrar . -escriba f -perm 644 -exec chmod 655 {} ;

También puede buscar directorios con permisos 644 y sustituirlos por 755.

encontrar . -tipo d -perm 644

Salida

./docs  

La carpeta docs tiene permisos 644

drwxrwxr-x 2 jack jack 4096 3 de enero 12:45 docs

Para establecerlo en 755, ejecutamos

find . -type d -perm 644 -exec chmod 755 {} ;

Ahora podemos comprobar de nuevo qué es exactamente 755

find . -tipo d -perm 755

Salida
.
./docs

De lo anterior podemos ver que los directorios root y docs tienen los permisos 755.

El comandoLs -la da los siguientes detalles

drwxr-xr-x 2 jack jack 4096 Ene 3 12:45 docs

Buscar y copiar archivos o directorios

Buscar y copiar un archivo específico en un directorio

El comando siguiente encontrará el archivo archivo22 .txt y lo copiará en el directorio ~/tmp/imágenes.

find -iname archivo22.txt -exec cp {} ~/tmp/imágenes ;

Encontrar y copiar un tipo de archivos en un directorio

Para encontrar archivos como imágenes con extensión jpg en el directorio actual y copiarlos a una ubicación diferente como una carpeta de imágenes, utilice;

find -iname '*.jpg' -exec cp {} ~/tmp/images ;

Esto encontrará y copiará todos los archivos jpg a la carpeta ~/tmp/images.

Encontrar y copiar un archivo en varios directorios

Encuentre y copie un único archivo a varios directorios.

find ~/tmp/dir1/ ~/tmp/dir2/ $HOME/3/ -maxdepth 0 -exec cp ~/numeric/hci {} ;

Esto encontrará el archivo hci y lo copiará en los tres directorios de /tmp/dir1/ /tmp/dir2/ y $HOME/3/

Encontrar y mover archivos a un directorio diferente

Para mover un archivo conocido de un directorio a otro. Para mover el archivo universal.php

find ~/folder/ -type f -name universal.php -exec mv {} ~/numeric/ ;

Buscar y mover archivos con una extensión determinada a una carpeta diferente

find ~/numeric/ -type f -name '*.php' -exec mv {} ~/folder/ ;

Buscar determinados archivos y moverlos a una carpeta diferente específica

find -type f -name uni*.* -exec mv {} ~/unifiles/ ;

El comando busca todos los archivos cuyos nombres empiecen por uni y tengan cualquier extensión. A continuación, los mueve al directorio /unifiles/

Buscar y mover archivos en función de la antigüedad

Encuentra y mueve los ficheros con una antigüedad superior a los días especificados a una ubicación diferente, como el archivo.

find /ruta/ -type f -name '*.pdf' -mtime 20 -exec mv {} /backup1/ ;

Esto buscará archivos pdf con más de 20 días de antigüedad y los moverá al directorio backup1.

Buscar y eliminar archivos y directorios

La sintaxis para buscar y eliminar archivos o directorios en el directorio actual es

find .type f -name "archivo a eliminar" -exec rm -f {} ; para eliminar sólo archivos o

find . -type d -name «dir-to-delete" -exec rm -rf {} ; para borrar directorios solamente

Buscar y eliminar sólo archivos específicos

Para buscar y borrar archivos que empiecen por til, utilice

find . -type f -name "til*" -exec rm {} ; 

Para buscar y eliminar directorios que empiecen por til

find . -tipo d -nombre "til*" -exec rm {} ;

Eliminar tanto archivos como directorios

encontrar . -nombre "til*" -exec rm -rf {} ; 

Esto eliminará tanto los archivos como los directorios que empiecen por las letras til.

Eliminar por extensión

A continuación le mostramos cómo puede localizar y eliminar todos los archivos txt del directorio actual. Sustituya el txt por otra extensión como bak, pdf o cualquier otra que desee eliminar.

buscar . -type f -name "*.txt" -exec rm -f {} ;

En caso de que desee que el sistema le pida confirmación antes de eliminar cada archivo, añada la opción -i como se indica a continuación.

buscar . -escriba f -nombre "*.txt" -exec rm -i {} ;

Salida

rm: ¿eliminar archivo vacío regular './Archivo22.txt'? y
rm: remove regular empty file './archivo22.txt'? y
rm: ¿eliminar el archivo vacío './archivo23.txt'?

Por defecto, la opción -rm no eliminará los directorios y deberá utilizar la opción -r para garantizar una eliminación recursiva. Esto asegura la eliminación de los directorios vacíos y de los que contienen archivos. La opción -f fuerza la eliminación y se utiliza tanto para los archivos como para los directorios.

Buscar y eliminar archivos de más de n días

Encuentra y elimina los archivos de copia de seguridad con más de 20 días de antigüedad del directorio actual.

buscar . -type f -name '*.bak' -mtime 20 -exec rm {} ;

Esto borrará todos los archivos .b ak con más de 20 días de antigüedad.

Encontrar y borrar directorios solamente

Para borrar un directorio llamado dir22

encontrar . -escriba d -nombre dir22 -exec rm -rf {} ;

Asegúrese de distinguir entre mayúsculas y minúsculas en el nombre del directorio o utilice la opción -iname.

encontrar . -tipo d -nombre dir22 -exec rm -rf {} ;

Elimina tanto Dir22 como dir22

Para confirmar antes de la eliminación, utilice la opción -i.

find . -tipo d -iname Dir22 -exec rm -rf -i {} ;

Salida
rm: ¿eliminar directorio ‘./Dir22’? n
rm: ¿eliminar directorio ‘./dir22’? y

En nuestro caso, hemos tecleado n para el directorio Dir22 que no será eliminado e y para el dir22 que ahora será eliminado.

Buscar y eliminar archivos vacíos

Puede utilizar cualquiera de los siguientes comandos para localizar archivos vacíos y eliminarlos automáticamente.

find ./ -type f -size 0 -exec rm -f {} ;

o
find ./ -type f -size 0 | xargs rm -f
o
find ./ -type f -size 0 -delete

Encontrar y eliminar directorios vacíos

Para eliminar directorios vacíos utilizaremos la opción d.

find ./ -type d -empty -exec rmdir {} ;

Otra alternativa es utilizar delete en lugar de remove.

find ./ -type d -empty -delete

Tenga en cuenta que borrar archivos críticos o del sistema de su ordenador puede dañar el sistema operativo o las aplicaciones o provocar la pérdida de sus datos importantes.

Para evitar borrados accidentales, la mejor práctica es utilizar una cuenta de usuario no root. Además, asegúrese de que está borrando los archivos correctos que no son útiles y de que tiene una copia de seguridad de todos sus archivos de datos por si acaso.

¿Y ahora qué?

Siga adelante y pruebe los comandos find de Linux anteriores en su entorno de laboratorio o NO PRODUCCIÓN. Vea si puede utilizar algunos para automatizar la limpieza del sistema de archivos con Crontab. Y, para dominar Linux, eche un vistazo a este curso en línea.