GNU/Linux >> Tutoriales Linux >  >> Linux

Una guía para el comando "Buscar" de Linux

El comando de búsqueda permite a los usuarios buscar archivos y realizar acciones en ellos. Es parte del paquete "findutils" y viene incluido con todas las distribuciones. Es muy flexible, lo que le permite buscar archivos y directorios en función de una variedad de condiciones. Opcionalmente, también te permite realizar diferentes tipos de acciones sobre los resultados.

En este artículo, entenderemos cómo trabajar con el comando de búsqueda. También ilustraremos su uso a través de varios ejemplos a lo largo de este artículo.

Introducción

La estructura básica del comando de búsqueda es así:

find [paths] [expression] [actions]

El comando de búsqueda toma varias rutas y busca archivos y directorios en cada ruta "recursivamente". Por lo tanto, cuando el comando de búsqueda encuentra un directorio dentro de la ruta dada, busca otros archivos y directorios dentro de él. Nuevamente, si hay otros directorios dentro, el comando de búsqueda también buscará dentro de ellos. Este proceso continúa hasta que haya buscado todos los elementos dentro de la ruta que especificó.

De forma predeterminada, el comando de búsqueda encuentra todo lo que hay dentro de un directorio. Si desea filtrar algunos de ellos según ciertos criterios, puede especificar una expresión para hacerlo.

La acción predeterminada es imprimir todos los resultados. Sin embargo, también puede especificar una acción personalizada que el comando de búsqueda puede realizar en los resultados.

Estos conceptos se aclararán a medida que analicemos varios ejemplos mencionados más adelante en este artículo.

Encontrar todos los archivos y directorios

Imagine que desea enumerar todos los directorios y archivos de una ruta determinada. Por ejemplo, si desea enumerar el contenido del /usr/share directorio, ejecute:

find /usr/share

Esto le dará una lista de archivos y directorios, como se muestra en la siguiente captura de pantalla. Dependiendo del contenido del directorio, ¡esta lista puede ser muy grande!

Si desea enumerar el contenido de varios directorios, puede hacerlo así:

find /usr/share /bin /usr/lib

Si desea enumerar el contenido del directorio de trabajo actual, use un punto (. ) como la ruta:

find .

Cuando no hay rutas, el comando de búsqueda asume que debería funcionar con el directorio actual. Entonces, puedes dejar el . y simplemente use:

find

Buscar elementos por su nombre

Como mencionamos anteriormente, puede filtrar los resultados del comando de búsqueda usando expresiones. En esta sección, aprenderemos a filtrar elementos por su nombre.



Si desea encontrar un archivo o directorio llamado NEWS.txt dentro del /usr directorio, use el -name cambiar así:

find /usr -name NEWS.txt

El -name el interruptor distingue entre mayúsculas y minúsculas. Si no conoce el caso exacto del artículo que está buscando, puede utilizar el -iname interruptor que no distingue entre mayúsculas y minúsculas:

find /usr -iname news.txt

El -name y -iname los conmutadores también aceptan "comodines", que son caracteres especiales que actúan como marcadores de posición. Hay dos comodines:el ? carácter representa un único carácter desconocido, y el * carácter representa cualquier número de caracteres desconocidos (incluido cero).

Si desea utilizar un carácter comodín, debe conservar el name /iname parámetro dentro de comillas simples o dobles. Desde el * y ? Los caracteres también son caracteres especiales para el shell, ponerlos entre comillas asegura que el comando funcione correctamente.

Como ejemplo, si tiene que buscar todos los archivos y directorios dentro de /usr que tienen un .txt al final de su nombre, puede usar:

find /usr -name '*.txt'

Si desea buscar archivos y directorios con cuatro letras en su nombre, ejecute:

find /usr -name '????'

A veces, es posible que desee hacer coincidir la ruta completa con un archivo/directorio, en lugar de solo hacer coincidir el nombre. En tal situación, puede usar el -path cambiar. Como ejemplo, digamos que desea encontrar todos los archivos y directorios con un .txt al final de su nombre, pero solo si están en un directorio llamado src . Así, en la ruta completa habrá un /src/ en algún lugar en el medio, y un .txt al final. Entonces, el comando será:

find /usr -path '*/src/*.txt'

También está el -ipath switch, que es la versión que no distingue entre mayúsculas y minúsculas de -path .

Buscar archivos o directorios

Todos los ejemplos que hemos visto hasta ahora devuelven archivos y directorios. Sin embargo, si necesita buscar archivos o directorios solamente, puede usar el -type cambiar. Los parámetros más comunes de -type son:

  • f :archivos
  • d :directorios
  • l : enlaces simbólicos

Por ejemplo, para encontrar todos los archivos en el /usr directorio, ejecute:

find /usr -type f

También puede combinar los distintos interruptores del comando de búsqueda. Por ejemplo, para encontrar todos los .txt archivos en el /usr directorio, puede usar:

find /usr -type f -name '*.txt'

De manera similar, para encontrar directorios dentro de /usr que comienzan con "python", use:

find /usr -type d -name 'python*'

Encontrar archivos vacíos

El comando de búsqueda es compatible con -empty bandera para buscar archivos y directorios que están vacíos. Un archivo vacío es uno que no tiene contenido, mientras que un directorio vacío es uno que no tiene archivos ni subdirectorios.

Por ejemplo, si desea buscar una lista de directorios vacíos en su directorio de inicio, puede ejecutar:

find ~ -type d -empty

Negación de coincidencias

El comando de búsqueda también le permite "negar" una coincidencia. Esto es útil cuando tenemos un criterio para excluir de nuestra búsqueda.



Como ejemplo, digamos que desea buscar archivos en el /usr directorio que no tiene el .txt extensión. Puedes negar el -name cambie agregando un signo de exclamación (! ) delante de él, como se muestra:

find /usr -type f ! -name '*.txt'

También puede invertir cualquier otro interruptor. Entonces, si desea encontrar los directorios no vacíos en su directorio de inicio, ejecute:

find /usr -type f ! -empty

Búsqueda basada en propiedad

El comando de búsqueda admite la búsqueda de archivos y directorios en función de su información de propiedad.

Para encontrar los archivos o directorios que pertenecen a un usuario en particular, puede usar el -user cambiar. Por ejemplo, si desea encontrar todos los archivos en el sistema que pertenecen al usuario booleanworld , ejecuta:

find / -type f -user booleanworld

También puede usar la identificación de un usuario en el comando anterior, en lugar del nombre de usuario. Puede buscar la ID de un usuario con el siguiente comando:

id -u <username>

Asimismo, el -group switch le permite buscar archivos y directorios que pertenecen a un grupo en particular. También puede aceptar un nombre de grupo o una ID de grupo. Puede ver el ID de grupo de un usuario con el siguiente comando:

id -g <username>

Búsqueda de archivos por fecha y hora

A veces, es posible que deba buscar archivos dependiendo de cuándo se accedió o se modificó. En un sistema Linux, hay tres tipos de "tiempo" asociados con un archivo:

  • Hora de modificación :La última vez que se modificó el contenido del archivo.
  • Tiempo de acceso :La última vez que se leyó el archivo.
  • Cambiar hora :la última vez que se modificó el archivo (ya sea su contenido o metadatos, como los permisos).

Para encontrar archivos basados ​​en la hora de modificación, acceso o cambio, el comando de búsqueda tiene el -mtime , -atime y -ctime interruptores Estos interruptores le permiten filtrar archivos según la cantidad de días. Aquí, un "día" se refiere a un período de 24 horas.

Entendamos cómo usar estas banderas. Como ejemplo, si usa -mtime , entonces:

  • -mtime 2 :el archivo se modificó hace 2 días (es decir, en las últimas 48 a 72 horas).
  • -mtime -2 :el archivo se modificó hace menos de 2 días (es decir, en las últimas 48 horas).
  • -mtime +2 :el archivo se modificó hace más de 2 días (es decir, 3 o más días, lo que significa 72 horas o más tarde).

Entonces, para encontrar archivos en /usr que se modificaron hace dos días, ejecute:

find /usr -type f -mtime 2

El -atime y -ctime los interruptores funcionan exactamente de la misma manera que -mtime .

Si encuentra que un día es demasiado largo, también puede usar -mmin , -amin o -cmin para filtrar en minutos. Entonces, -amin +5 significa archivos a los que se accedió hace más de 5 minutos, -amin -5 significa que el archivo se modificó hace menos de 5 minutos y así sucesivamente.

Puede usar muchas de estas banderas a la vez. Si desea buscar archivos modificados hace 2 días y accedidos hace 5 minutos, ejecute:

find /usr -type f -mtime 2 -amin 5

¡Incluso puedes repetir la misma bandera! Como ejemplo, desea buscar archivos modificados hace entre 50 y 100 días, use:

find /usr -type f -mtime +50 -mtime -100

Búsqueda basada en el tamaño

El comando de búsqueda tiene un -size cambiar para permitir a los usuarios encontrar archivos en función de su tamaño. Dado que solo los archivos pueden tener un tamaño de archivo, cuando utilice este modificador, no aparecerán directorios en la lista.

Para especificar el tamaño del archivo, ponemos un número seguido de una letra para representar la unidad. Puede utilizar las siguientes letras:

  • c :bytes
  • k :kilobytes
  • M :megabytes
  • G :gigabytes

Además, puedes usar un + o - para imponer una condición de "mayor que" o "menor que".

Entendamos esto con algunos ejemplos. Si desea enumerar todos los archivos en el sistema con un tamaño de 10 KB, use:

find / -size 10k

Para encontrar archivos que tengan más de 1 GB de tamaño, use:

find / -size +1G

Del mismo modo, para encontrar archivos que tengan menos de 10 MB de tamaño, use:

find / -size -10M

Búsqueda basada en permisos

El comando de búsqueda admite el -perm cambiar para permitir búsquedas basadas en permisos. Le permite realizar búsquedas basadas en modos numéricos y simbólicos. Si no está familiarizado con los permisos, puede encontrar una descripción general aquí.

Uso de permisos simbólicos

Empecemos con un ejemplo sencillo. Supongamos que desea buscar todos los archivos y directorios en el /usr directorio con permisos de rwxr-xr-x . Para hacerlo, ejecute:

find /usr -perm u=rwx,g=rx,o=rx

Las letras u , g y o significa "usuario", "grupo" y "propietario" respectivamente.

También puedes usar la letra a para comprobar los permisos que se aplican a todos los usuarios. Por ejemplo, para buscar todos los archivos y directorios del sistema con el permiso r-xr-xr-x , ejecuta:

find /usr -perm a=rx

A menudo, nos interesa hacer coincidir un subconjunto de los permisos. Por ejemplo, es posible que desee buscar archivos en el sistema que puedan ejecutar todos los usuarios. En este caso, solo nos importa que el bit de ejecución esté configurado para las tres clases de permisos. Sin embargo, el resto de bits se pueden activar o desactivar.

Dado que todas las clases de permiso deben tener el bit de ejecución establecido, escribimos el permiso como a=x . Luego, agregamos un / delante para indicar que tenemos la intención de hacer coincidir un subconjunto de permisos. Por lo tanto, el comando es:

find / -type f -perm /a=x

Uso de permisos numéricos

Consideremos el primer ejemplo de la sección anterior. Esto es bastante sencillo:rwxr-xr-x es 644 en modo numérico, por lo que simplemente puede ejecutar:

find /usr -perm 644

Verificar un subconjunto de permisos es un poco más complejo. Como mencionamos anteriormente, buscar archivos que todos puedan ejecutar implica verificar si el bit de ejecución está configurado. No nos importan las otras partes. Por cada bit que debamos comprobar, ponemos un 1, y para el resto ponemos un 0. Con este proceso, obtenemos un número binario y lo convertimos a octal como se muestra:

A continuación, agregamos un - delante de este número para indicar que tenemos la intención de hacer coincidir un subconjunto de permisos. Por lo tanto, el comando es:

find / -type f -perm -111

Búsqueda basada en indicadores de derechos de acceso

Ahora, digamos que está interesado en buscar en función de las banderas de derechos numéricos. Para este propósito, puede usar modos numéricos o simbólicos.

Como ejemplo, digamos que está interesado en encontrar todos los archivos en su sistema con el conjunto de bits setuid. Podemos extender lo que aprendimos sobre los modos numéricos a esta situación. En este caso, solo nos importa el indicador setuid, que tiene un valor de 4. Sin embargo, no nos importa ninguno de los bits de permiso, lo que significa que obtenemos 000. Por lo tanto, podemos buscar estos archivos usando:

find / -type f -perm -4000

Por supuesto, también puede filtrar por bits de permiso. Si está interesado en los archivos que todos los usuarios pueden ejecutar y también tiene configurado el bit setuid, reemplace 4000 con 4111 en el comando anterior. (Ya hemos visto cómo obtenemos el valor 111.)

De manera similar, puede usar 2000 para el bit setgid y 1000 para el bit sticky. Si desea probar una combinación de estos bits, sume los valores. Por ejemplo, para probar el setuid y el sticky bit, usaría 5000 (=4000 + 1000).

Si quiere hacer lo mismo con los modos simbólicos, puede usar:

find / -type f -perm /u=s

Para el bit setgid, use /g=s , y para el sticky bit use /o=t . Para probar una combinación de estos bits, sepárelos con comas, como /u=s,o=t .

Limitación de la profundidad de recorrido

Como mencionamos anteriormente, el comando de búsqueda busca elementos de forma recursiva. Sin embargo, los resultados obtenidos pueden ser muy grandes y es posible que desee establecer un límite en la profundidad de búsqueda del comando de búsqueda. Esto se puede hacer con el -maxdepth cambiar.

Si ejecuta el siguiente comando, notará que todos los elementos mostrados no tienen más de tres niveles de profundidad:

find / -maxdepth 3

En otras situaciones, es posible que desee establecer un límite en la profundidad mínima. El comando de búsqueda también es compatible con -mindepth cambiar para este propósito. Entonces, si ejecutas:

find / -mindepth 3

Operaciones lógicas en el comando de búsqueda

En las secciones anteriores, hemos visto las banderas compatibles con el comando de búsqueda. También hemos visto cómo podemos combinar varias banderas y negarlas. En algunas situaciones, necesitamos construcciones más poderosas.

El comando de búsqueda admite las condiciones "y" y "o" con -a-o interruptores También admite agrupar partes de una expresión con paréntesis () . Sin embargo, dado que los paréntesis también son caracteres especiales para el shell, debe ponerlos entre comillas simples o dobles. Además, cuando especifica varios indicadores uno tras otro, el comando de búsqueda asume automáticamente un "y".

Consideremos un ejemplo que vimos antes:encontrar directorios dentro de /usr que comienzan con "python". Allí, usamos el comando:

find /usr -type d -name 'python*'

También puedes escribir “y” explícitamente así:

find /usr -type d -a -name 'python*'

Ahora, consideremos un ejemplo diferente. Supongamos que desea buscar archivos/directorios en el sistema que se modificaron en los últimos 5 minutos o antes de los 50 días. Para este comando, usaremos el operador "o" así:

find / -mmin -5 -o -mtime +50

A continuación, supongamos que imponemos una restricción adicional al problema anterior:solo desea buscar archivos. Primero, mantendremos las condiciones para filtrar archivos modificados en un grupo. Luego, lo “y” con la condición de encontrar archivos. Por lo tanto, el comando final es:

find / '(' -mmin -5 -o -mtime +50 ')' -a -type f

Desde el -a está implícito, también puede dejarlo fuera del comando anterior.

Tomar acciones

Hasta ahora, todos los comandos de búsqueda imprimen los resultados en la terminal. Por lo general, queremos realizar algunas acciones con estos resultados, como copiar o eliminar estos elementos. Afortunadamente, el comando de búsqueda también admite la realización de "acciones" en estos resultados.

La acción predeterminada es imprimir todos los resultados; puede verificar esto agregando el -print cambiar al final de cualquier comando de búsqueda. Hay muchas otras acciones también. Veremos algunos de los más útiles a continuación.

Eliminar archivos

Para eliminar cualquier archivo o directorio, use el -delete acción. Funciona tanto con archivos como con directorios. Por ejemplo, si desea eliminar todos los directorios vacíos del directorio de inicio, ejecute:

find ~ -type d -empty -delete

Ejecución de comandos

El comando de búsqueda también admite la ejecución de un comando personalizado con el -exec cambiar.

Supongamos que desea hacer una copia de seguridad de todo su audio MP3 desde su directorio de inicio a su disco duro externo. Suponga que el disco duro externo está disponible en /media/MyDrive . Para copiar un solo archivo, usaría:

cp <path to file> /media/MyDrive

Para copiar todos los archivos, puede usar el siguiente comando.

find ~ -type f -name '*.mp3' -exec cp {} ';'

Aquí, el par de llaves ({} ) actúan como marcador de posición para la ruta al archivo. Para decirle al comando de archivo dónde termina el comando, usamos un punto y coma (; ). Sin embargo, dado que también es un carácter especial para el shell, lo envolvemos entre comillas simples.

Cada vez que el comando de búsqueda encuentra un archivo que coincide con la condición, reemplaza las llaves con la ruta real y ejecuta el comando. Entonces, el cp el comando se ejecuta para cada archivo MP3.

Veamos otro uso importante:encontrar una cadena en muchos archivos. Para encontrar la cadena "hola" en un archivo, usamos grep así:

grep hello <file name>

Si está familiarizado con grep , podría tener la tentación de escribir un comando como este:

find ~ -type f -exec grep hello {} ';'

Sin embargo, si usa este comando, comprenderá inmediatamente el problema. Queremos una lista de archivos con la cadena "hola"; sin embargo, obtenemos una lista de líneas coincidentes. Afortunadamente, grep tiene un -l switch, lo que hace que imprima la ruta del archivo si hay una coincidencia. Entonces, el comando será:

find ~ -type f -exec grep -l hello {} ';'

Ejecución de comandos:una variante diferente

Supongamos que desea crear un archivo comprimido. Para crear un archivo comprimido con Gzip con el nombre music.tar.gz , ejecutarías:

tar -czf music.tar.gz <list of files>

Ahora, suponga que desea comprimir todos los archivos MP3 en su directorio de inicio en un solo archivo comprimido. Tal vez se le ocurriría lo siguiente:

find ~ -type f -name '*.mp3' -exec tar -czf music.tar.gz {} ';'

Sin embargo, si abre el music.tar.gz archivo, notará que solo hay un archivo MP3. Recuerda que find ejecuta el comando cada vez que encuentra un nuevo archivo. Entonces, el archivo anterior se sobrescribió con un nuevo archivo cada vez; y no queremos que eso suceda.

Todos nuestros problemas podrían resolverse si hubiera una manera de decirle a find para pasar una lista de archivos a tar , después de haber encontrado todos los archivos. Aquí es donde la segunda variante del -exec el interruptor entra. En lugar de terminar el comando con un ; , usamos un + así:

find ~ -type f -name '*.mp3' -exec tar -czf music.tar.gz {} +

Ejecución de comandos en directorios

A veces, es útil ejecutar un comando en el directorio dentro del cual se encuentra un archivo/directorio. El comando de búsqueda tiene un -execdir interruptor que hace esto. Es similar a -exec de todas las demás formas, e incluso tiene el + y ; variantes.

Ver información del archivo

Si desea ver información sobre los archivos/directorios (como permisos y tamaño), puede usar el -ls cambiar. Por ejemplo, si desea ver detalles sobre archivos en el sistema que tienen más de 1 GB, ejecute:

find / -type f -size +1G -ls

Eliminar mensajes de error

Al probar algunos de los comandos de búsqueda, es posible que haya recibido algunos errores como "Permiso denegado". Puede ocultar estos mensajes de error redirigiéndolos a /dev/null , como se muestra:

find [paths] [expression] [actions] 2>/dev/null

Conclusión

En este artículo, hemos visto cómo usar el comando de búsqueda, junto con ejemplos que cubren la mayoría de los casos de uso. Si desea leer más, puede leer la página de manual escribiendo man find en tu terminal.


Linux
  1. Encuentra archivos y directorios en Linux con el comando de búsqueda

  2. Una guía de la terminal de Linux para principiantes

  3. Domina el comando ls de Linux

  4. Encuentre el tiempo de ejecución de un comando o proceso en Linux

  5. encontrar ejemplos de comandos en Linux

Una guía para principiantes para navegar por el sistema de archivos de Linux

Cómo encontrar archivos con el comando fd en Linux

El comando del temporizador en Linux

15 ejemplos súper útiles del comando Buscar en Linux

Una guía práctica para el comando chroot en Linux

El comando find Directory de Linux:Explicación