El comando de búsqueda se utiliza para buscar archivos y directorios en la línea de comandos de Linux.
Buscar es uno de los comandos más potentes y de uso más frecuente. También es uno de los comandos más extensos con más de 50 opciones y esto lo hace un poco confuso, especialmente cuando se combina con el comando exec o xargs.
Es imposible que un administrador de sistemas o desarrollador de software evite el comando de búsqueda mientras trabaja en la línea de comandos. En lugar de tenerle miedo, debes abrazar su poder.
Voy a discutir algunos de los ejemplos más comunes del comando de búsqueda que es probable que utilice. Pero antes de eso, déjame mostrarte su sintaxis y cómo usarla.
Buscar comando en Linux
La sintaxis general para el comando de búsqueda es:
find [directory to search] [options] [expression]
Todo lo que está entre paréntesis [] es opcional. Significa que puede ejecutar find
comando sin opciones ni argumentos. Simplemente volcará todos los archivos y directorios en la ubicación actual. Eso no es muy útil, ¿verdad?
Veámoslo con más detalle:
directory to search
es básicamente la ubicación desde donde desea iniciar su búsqueda. De forma predeterminada, la búsqueda es recursiva y comienza desde su ubicación actual.options
especifique el tipo de búsqueda, ya sea por nombre, por tipo, por tiempo modificado, etc. Hay más de 50 opciones posibles aquí.expression
le permite especificar el término de búsqueda. Si desea buscar un archivo por su nombre, la expresión es el nombre del archivo. Si desea buscar archivos con un nombre que coincida con un patrón, expresión en el patrón.
Permítanme tomar un ejemplo simple:
find . -type f -name myfile
Este comando ejecutará una búsqueda en el directorio actual y sus subdirectorios para encontrar un archivo (no un directorio) llamado myfile
. La opción -type f
le pide que busque archivos solamente. El punto único .
significa el directorio actual.
Veamos algunos ejemplos prácticos del comando de búsqueda.
Buscar archivos y directorios por nombre
Puede buscar archivos y directorios por su nombre:
find . -name SEARCH_NAME
Como no se menciona ningún tipo de archivo, busca tanto archivos como directorios con el nombre dado.
El siguiente ejemplo encuentra archivos y directorios llamados mystuff:
[email protected]:~/Examples$ find -name mystuff
./new/mystuff
./mystuff
Buscar solo archivos o solo directorios
Si solo desea buscar archivos, especifique el tipo de archivo -f:
find . -type f -name SEARCH_NAME
El orden de tipo y nombre no importa. Tome el ejemplo anterior y busque solo archivos:
[email protected]:~/Examples$ find -type f -name mystuff
./mystuff
Si solo desea buscar directorios, especifique el tipo -d:
find . -type d -name SEARCH_NAME
En el archivo anterior, busque solo directorios:
[email protected]:~/Examples$ find -type d -name mystuff
./new/mystuff
Ejecutar una búsqueda que no distinga entre mayúsculas y minúsculas
De forma predeterminada, el comando de búsqueda distingue entre mayúsculas y minúsculas. Puede ejecutar una búsqueda que no distingue entre mayúsculas y minúsculas con el nombre dado usando -iname
en lugar de -name
.
find . -type f -iname SEARCH_NAME
Puedes usarlo con type d
también.
[email protected]:~/Examples$ find -iname mystuff
./new/mystuff
./MyStuff
./mystuff
Captura de pantalla de los tres ejemplos anteriores:
Buscar archivos por su extensión (importante)
Uno de los usos más comunes del comando de búsqueda es encontrar archivos de un tipo específico o debería decir una extensión específica.
Por ejemplo, supongamos que desea buscar todos los archivos C++ en los directorios actuales. Los archivos C++ terminan con la extensión .cpp, por lo que puede buscarlos así:
find . -type f -name "*.cpp"
De esta manera, le dices al comando de búsqueda que busque type file
y con nombres que terminan en .cpp
.
[email protected]:~$ find . -type f -name "*.cpp"
./file.cpp
./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream2/zstream_test.cpp
./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream/test.cpp
./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream/zfstream.cpp
Siempre ponga su expresión de búsqueda entre comillas dobles cuando use el comando de búsqueda. ¿Por qué recomiendo usar comillas dobles o comillas simples alrededor de su término de búsqueda? Porque si no hace eso, el shell expandirá el comodín.
Si no escribe su término de búsqueda entre comillas:
find . -type f -name *.cpp
Su shell expandirá *.cpp y lo reemplazará con todos los archivos en el directorio actual cuyos nombres terminan con .cpp.
Esto podría funcionar si solo hay un archivo, pero si hay más de uno, su shell se quejará de una sintaxis incorrecta.
En el ejemplo anterior, solo hay un archivo cpp y, por lo tanto, cuando el comando se expande a find . -type f -name file.cpp
, funciona porque file.cpp
todavía funciona como término de búsqueda.
Pero hay dos archivos .txt en el mismo directorio y, por lo tanto, cuando el comando se expande a find . -type f -name another.txt new.txt
, se queja porque ahora hay más de un término de búsqueda.
Es por eso que siempre debe incluir su término de búsqueda entre comillas dobles.
Buscar varios archivos con varias extensiones (o condiciones)
El comando anterior buscó archivos con una extensión dada. ¿Qué sucede si desea buscar archivos con diferentes extensiones?
En lugar de ejecutar el comando de búsqueda varias veces, ejecútelo una vez usando -o
opción que funciona como condición OR lógica:
find . -type f -name "*.cpp" -o -name "*.txt"
He aquí un ejemplo:
[email protected]:~/Examples$ find . -type f -name "*.txt" -o -name "*.cpp"
./new.txt
./file.cpp
./new/new.txt
./new/dir2/another.txt
./new/dir1/new.txt
./another.txt
Buscar archivos en un directorio específico
Hasta ahora, todos los ejemplos realizaron búsquedas en el directorio actual porque especificó . en los ejemplos.
El punto se puede reemplazar con una ruta absoluta o relativa de un directorio para que pueda buscar archivos en el directorio especificado sin salir de su ubicación actual.
[email protected]:~/Examples$ find ./new -name mystuff
./new/mystuff
Buscar archivos en múltiples directorios
Si cree que sus archivos deseados podrían estar ubicados en varias ubicaciones, no tiene que ejecutar el comando de búsqueda varias veces. Simplemente especifique todas las rutas de directorio para buscar en el comando de búsqueda:
find ./location1 /second/location -type f -name "pattern"
Buscar archivos y directorios vacíos
El -empty
La opción le permite buscar archivos y directorios vacíos con el comando de búsqueda.
Para encontrar todos los archivos y directorios vacíos en el directorio actual, use:
find . -empty
Puede especificar el tipo de archivo para buscar solo archivos o directorios vacíos:
find . -empty -type f
También puede combinarlo con la búsqueda de nombre de archivo:
find . -empty -type f -name "*.cpp"
Encuentre archivos grandes o pequeños (búsqueda basada en el tamaño del archivo)
Puede encontrar archivos grandes o archivos pequeños según la búsqueda realizada por el parámetro de tamaño. Esto solo funciona con archivos, no con directorios.
Usas el -size
opción con +N para tamaño mayor que N y -N para tamaño menor que N.
Encuentre archivos de exactamente 50 KB de tamaño:
find . -size 50k
Para buscar archivos de más de 1 GB en el directorio actual:
find . -size +1G
Para encontrar menos de 20 bytes:
find . -size -20c
Para buscar archivos de más de 100 MB pero de menos de 2 GB:
find . -size +100M -size -2G
También puede combinar la búsqueda de tamaño con la búsqueda de nombre. Por ejemplo, para buscar todos los archivos con un nombre que termina en .log pero un tamaño superior a 500 MB en el directorio raíz, puede usar:
find / -size +500M -name "*.log"
Para recordar:
c
:bytesk
:kilobytesM
:MegabytesG
:Gigabytes
Buscar archivos modificados recientemente (búsqueda basada en la hora de modificación o creación)
Conoces el concepto de mtime, atime y ctime, ¿verdad?
- mtime:hora de la última modificación del archivo
- ctime:hora de creación del archivo
- atime:última hora de acceso al archivo
A menudo se encontrará en situaciones en las que desea encontrar todos los archivos modificados recientemente. La búsqueda por hora modificada ayuda en estos casos.
Para encontrar todos los archivos modificados dentro de los 3 días (3*24H), use:
find . -type f -mtime -3
Para encontrar todos los archivos creados hace al menos 5 días (5*24H), use:
find . -type f -ctime +5
Sé que 24 horas es un marco de tiempo enorme. ¿Qué sucede si desea buscar archivos que se modificaron hace solo unos minutos? Para eso, puedes usar mmin
, amin
y cmin
.
Para buscar todos los archivos que se modificaron en los últimos 5 minutos, use:
find . -type f -mmin -5
Puede especificar los límites superior e inferior junto con el nombre de búsqueda. El siguiente comando buscará todos los archivos .java que hayan sido modificados entre los últimos 20 a 30 minutos.
find . -type f -mmin +20 -mmin -30 -name "*.java"
Buscar archivos con permisos de archivo específicos
Espero que esté familiarizado con el concepto de permisos de archivos en Linux.
El comando de búsqueda le permite buscar archivos con un permiso de archivo y un modo de acceso específicos.
find -perm mode
Por ejemplo, para encontrar todos los archivos del modo de acceso 777 en el directorio actual;
find . -perm 777
Para encontrar todos los archivos con acceso de lectura y escritura para todos (coincidencia exacta, no coincidirá si el archivo tiene permiso de ejecución para todos):
find . -perm a=r+w
Buscar archivos propiedad de un usuario
También puede buscar archivos según la propiedad.
Por ejemplo, para buscar archivos propiedad del usuario John en el directorio actual, use:
find . -type f -user John
También puedes combinarlo con otras opciones como tamaño, hora y nombre:
find . -type f -user John -name "*.cpp"
No busque recursivamente, busque solo en el directorio actual
De forma predeterminada, el comando de búsqueda busca en todos los subdirectorios de su ubicación actual. Si no desea eso, puede especificar la profundidad de su búsqueda en 1. Esto restringirá la búsqueda solo al directorio actual y excluirá cualquier subdirectorio.
find . -maxdepth 1 -type f -name "*.txt"
Excluir un directorio de la búsqueda
si desea excluir un directorio de la búsqueda, puede hacerlo combinando ruta, poda y lógica o.
find . -path "./directory_exclude/*" -prune -o -name SEARCH_NAME
Tenga cuidado con el * en la ruta del directorio, -prune
después de la ruta y -o
después de la poda.
Básicamente, el comando podar pide no usar el valor especificado por la ruta. Prune siempre se usa con -o
para garantizar que el lado derecho de los términos se evalúe solo para los directorios que no fueron podados.
Tomar medidas sobre el resultado de los comandos de búsqueda (ejec y xargs)
Hasta ahora, ha aprendido varias formas de encontrar archivos según varios criterios. Eso es bueno. Pero puede mejorarlo tomando ciertas acciones sobre el resultado del comando de búsqueda.
Por ejemplo, ¿qué tal encontrar archivos que coincidan con cierto patrón de nombre y renombrarlos todos a la vez o encontrar archivos vacíos y eliminarlos?
Sabe que la redirección de tubería se puede usar para combinar la salida de un comando con la entrada de otro comando. Pero esto no funcionará con la salida del comando de búsqueda, al menos no directamente.
Tiene dos opciones si desea realizar una acción sobre el resultado del comando de búsqueda:
- Usar ejecutivo
- Usar xargs
Usar buscar y ejecutar
Suponga que desea hacer una lista larga (ls -l) de los archivos de búsqueda con el comando de búsqueda. Esto es lo que usas:
find . -type f -name "*.txt" -exec ls -l {} +
Aquí está el resultado:
[email protected]:~/Examples$ find . -type f -name "*.txt" -exec ls -l {} +
-rw-rw-r-- 1 abhishek abhishek 39 Oct 13 19:30 ./another.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 15:36 ./new/dir1/new.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 15:36 ./new/dir2/another.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 18:51 ./new/mystuff/new.txt
-rwxrwxrwx 1 abhishek abhishek 35 Oct 13 15:37 ./new/new.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 18:16 ./new.txt
Muchas personas olvidan agregar el {} +
al final del comando exec. Debes usarlo y cuidar el espacio entre {} y +.
El {} es lo que hace referencia al resultado del comando de búsqueda. Puedes imaginarlo como {archivo 1, archivo 2, archivo 3}. El +
sign se usa para terminar el comando exec.
También hay otra convención con exec:
find . -type f -name *.txt" -exec ls -l {} \;
Aquí,; se utiliza en lugar del signo +. El adicional \ before; se utiliza para escapar del carácter especial;.
La ventaja de {} +
es que ejecuta menos comandos como ls -l file1 file2 file3
mientras que {} \;
ejecutará ls -l file1
, ls -l file2
etc.
Pero, {} \;
tiene la ventaja de usar {}
más de una vez en la misma declaración ejecutiva. Por ejemplo, el siguiente comando cambiará el nombre de todos los archivos encontrados con la extensión .old.
find . -type f -name *.txt" -exec mv {} {}.old \;
Usando xargs
Muchos usuarios de Linux se acostumbran a la redirección de tuberías. Este comando exec con el final {} +
les parece intimidante.
Aquí es donde xargs ayuda. Simplemente analiza la salida del comando de búsqueda al comando xargs a través de una tubería.
find . -type f -name *.txt" | xargs ls -l
La sintaxis parece mucho más simple, ¿verdad? El comando Xargs también es muy poderoso. Puede leer sobre esto aquí.
Combinando find y grep
Ahora que sabe cómo combinar find con xargs y el comando exec, puede usarlo para combinar find y grep.
Para cualquier administrador de sistemas o desarrollador de software, find y grep es una de las combinaciones más comunes y, sin embargo, más útiles.
Busca patrones de nombre de archivo con find y luego usa grep para buscar el contenido dentro de esos archivos.
Por ejemplo, desea buscar todos los archivos .txt que contienen el término Alice. Combinas find y grep así:
find . -type f -name "*.txt" -exec grep -i alice {} +
Lo mismo se puede lograr con xargs también:
find . -type f -name "*.txt" | xargs grep -i alice
Por supuesto, este es el más simple de los ejemplos, pero si está familiarizado con el comando grep, puede usarlo a su gusto y necesidad.
Hay mucho más con encontrar...
Y no es posible enumerar todas las opciones y ejemplos del comando de búsqueda. Las posibilidades son infinitas, pero cuando se familiarice con el comando de búsqueda, puede comenzar a usarlo en una variedad de situaciones. Realmente depende de ti cómo combinas la lógica aquí.
Espero que encuentre útiles estos ejemplos de comando de búsqueda. Si aún tiene preguntas o sugerencias para mejorar este artículo, hágamelo saber en la sección de comentarios.