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 directorionombre-del-archivo
o directorio-a-buscar : Nombre del archivo o directorio a buscaracció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.
- Sin prefijo cuando desee encontrar archivos con los permisos exactos especificados.
- Con «
-
» para archivos con al menos el permiso especificado. Esto devuelve archivos con el permiso especificado así como con permisos adicionales superiores. - 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.