GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo encontrar archivos con docenas de criterios con el comando Bash Find

¿Alguna vez se ha quedado atascado buscando un archivo y no pudo recordar dónde lo guardó, y mucho menos el nombre del archivo en sí? En Linux, Bash find El comando lo ayudará a explorar su sistema para encontrar ese archivo.

¿No eres un lector? ¡Mira este video tutorial relacionado! b>¿No ve el video? Asegúrate de que tu bloqueador de anuncios esté deshabilitado.

El Golpe find El comando en Linux ofrece muchas formas de buscar archivos y directorios. En este tutorial, aprenderá cómo el último acceso a un archivo, los permisos y más pueden ayudar a encontrar archivos y directorios con Bash find dominio. ¡Empecemos!

Requisitos

Si desea seguir las diversas demostraciones de este tutorial, asegúrese de tener lo siguiente:

  • Una PC con Linux:este tutorial usa Ubuntu 20.04, pero cualquier distribución de Linux debería funcionar.
  • El find utilidad:la utilidad de búsqueda de Bash ya debería estar en todas las distribuciones de Linux. Este tutorial utiliza v4.7.0.

The Bash find Comando 101

Encontrar un archivo requiere algunos criterios; una parte del nombre del archivo, un tipo de archivo, permisos en el archivo, etc. El find El comando le permite definir esos criterios para limitar los archivos exactos que le gustaría encontrar. El comando find encuentra o busca también enlaces simbólicos (symlink). Un enlace simbólico es un archivo de acceso directo de Linux que apunta a otro archivo o carpeta en su computadora. Primero cubramos la forma más básica de usar Bash find comando.

Tal vez esté en su directorio de inicio, buscando un directorio llamado snap y todos los archivos y subdirectorios debajo de él. En ese caso, ejecute el find comando, seguido del nombre del directorio ("snap" ), ¡y eso es todo!

Dado que no hay otros argumentos de línea de comando a continuación, puede ver la lista de archivos y directorios que se encuentran recursivamente dentro del snap directorio.

find "snap"

Si no especifica el name parámetro, find asumirá que el primer argumento debe ser para el name parámetro, por ejemplo, find "snap" es lo mismo que find -name "snap .”

Buscar archivos con pruebas (también conocidos como filtros)

Has visto la forma más básica del find Comando y cómo funciona. Pero quizás quieras acotar un poco la búsqueda para definir criterios más específicos. Si es así, deberá aplicar pruebas. Las pruebas son criterios que proporcionas al find comando.

Las pruebas le dicen al find Comando para filtrar la salida en función de muchos criterios diferentes.

Buscar archivos por nombre de archivo o directorio

Tal vez solo recuerde cómo comienza el nombre del archivo, tal vez sin distinguir entre mayúsculas y minúsculas. En ese caso, puede usar un comodín para ayudar a reducir los resultados.

# Find files and directories with names starting with 'snap'
find -name "snap*"

# Find files and directories with names starting with 'snap'
# in case insensitive manner (For example:'Snap', 'snap', 'SNaP', etc.)
find -iname "snap*"

Búsqueda de archivos y directorios por tipo de archivo

Me gusta el -name prueba, el -type test es otra forma eficiente de encontrar archivos y directorios. El -type test te permite filtrar el resultado del find comando por archivos o directorios.

# Find a file named 'snap'
find "snap" -type f
# Find a directory named 'snap'
find "snap" -type d

Para restringir aún más la búsqueda de archivos, combine el -name y -type pruebas ejecutando el siguiente comando.

El find El siguiente comando busca directorios únicamente (-type d ) con nombres (-name ) que comienzan con snap .

find -name "snap*" -type d

Buscar archivos y directorios con pruebas y operadores

Ahora que has aprendido los conceptos básicos del find comando combinado con pruebas, es hora de llevar la búsqueda de archivos a un nivel superior. Quizás necesite encontrar archivos o directorios que coincidan con más de una condición, como el nombre y el tipo de archivo. En ese caso, debe combinar condiciones.

Cuando necesite agregar más de una condición para buscar archivos, puede combinar condiciones con operadores. Los operadores son elementos que le permiten combinar condiciones para formar pruebas/filtros más complejos.

Combinar dos condiciones con el -and Operador

Tal vez necesite encontrar algunos archivos o directorios que coincidan con un nombre específico y escribe. Para hacer eso, puedes usar el -and operador. El -and El operador le permite combinar dos o más expresiones y generar el resultado solo si el comando de búsqueda devuelve un valor verdadero. Las expresiones son las representaciones de ciertas condiciones, como cuando se filtran archivos por nombre (-name "snap" ).

Para demostrar cómo el -and El operador combina dos condiciones, ejecuta cada uno de los siguientes comandos.

# Find files only (-type f) and (-and) ensure the names (-name) start with snap
# in the current directory and subdirectories.
find -name "snap*" -and -type f

# Find directories only (-type d) and (-and) ensure the names (-name) start with snap
# in the current directory and subdirectories.
find -name "snap*" -and -type d

# Find files only (-type f) and (-and) ensure the names (-name) start with snap
find -name "snap" -and -type f

# Find directories only (-type d) and (-and) ensure the names (-name) start with snap
find -name "snap" -and -type d

Combinar dos condiciones con el -or Operador

Como el -and operador, el -or operador (-o ) también combina dos expresiones separadas. La diferencia es que el find El comando generará resultados incluso si solo una expresión es verdadera.

A continuación se muestra una sintaxis básica de cómo combinar dos condiciones con el -or operador. El find El comando genera el resultado incluso si solo uno, ya sea expr1 o expr2, devuelve un valor verdadero.

find  -or 

Tal vez le gustaría encontrar un nombre de archivo usando el -name parámetro de un tipo específico usando el -type parámetro. Si es así, ejecute el find comando a continuación para buscar archivos (-type f ) con nombres (-name ) que comienzan con snap -or chart .

find -name "snap*" -type f -or -name "chart*"

Filtrado de archivos con -not Operador

A diferencia de los dos primeros operadores en los que filtras los contenidos que buscas, el -not operador (! ) es lo contrario. El -not El operador excluye archivos y directorios que no desea ver en el resultado de la búsqueda.

Tal vez desee buscar archivos solo con nombres que no comenzar con un nombre específico. En ese caso, ejecute el siguiente comando. Observe el find El siguiente comando solo busca archivos (-type f ), con nombres (-name ) que no comienza con snap .

find -not -name "snap*" -type f

Buscar archivos agrupando expresiones

A estas alturas, ha aprendido a usar pruebas y operadores para filtrar el find resultado del comando. Pero, ¿y si el resultado de su objetivo es un poco complejo? Si es así, debe buscar expresiones de agrupación. El Golpe find El comando le permite agrupar expresiones, lo que significa definir dos o más "conjuntos" de condiciones.

Agrupar expresiones con paréntesis

Digamos que necesita encontrar archivos o directorios con diferentes nombres. Pronto encontrarás que la tarea es imposible usando el find conceptos básicos de comando, como se explicó anteriormente. Como solución, necesitará usar paréntesis para combinar las expresiones para formar una sola expresión compleja.

En este ejemplo a continuación, el find El comando buscará archivos (-type f ) con .html extensión o directorios (-type d ) con nombres que comienzan con chart .

Tanto los paréntesis de apertura como de cierre se escapan con una barra invertida (\ ) para permitir que el terminal lea los paréntesis literalmente. El carácter de escape le dice al find comando para tratar al personaje literalmente.

find \( -name "*.html" -type f \) -or \( -name "chart*" -type d \)

En lugar de usar paréntesis, también puede usar comas para agrupar expresiones como find -name "snap*" -type d -delete, -name "chart*" -print . Agrupar expresiones por comas es básicamente una serie de tareas en ejecución en un solo comando.

Buscando archivos desde el directorio principal

En todos los ejemplos anteriores, Bash find El comando encontró archivos solo del directorio de trabajo actual y todos los subdirectorios. Pero tal vez necesite comenzar su búsqueda en el directorio principal. Si es así, da el -depth opción un tiro. El -depth El parámetro enumera archivos y directorios en orden de profundidad, como se muestra a continuación.

El find El siguiente comando enumera primero el contenido del directorio principal y luego hasta el directorio de trabajo (snap ).

find "snap" -depth

Búsqueda de archivos y directorios por permiso

En lugar de buscar archivos filtrados por nombre y tipo, el comando de búsqueda también le permite buscar archivos y directorios filtrados por permiso. En Linux, cada archivo y carpeta tiene permisos específicos para propietarios, propietarios de grupos y otros usuarios. El find El comando le permite aprovechar esos permisos para filtrar el resultado de la búsqueda de archivos y directorios con el -perm opción.

Antes de intentar buscar archivos y directorios con el -perm opción, deberá familiarizarse con los permisos de lectura. Los permisos indican quién tiene acceso y puede modificar ciertos archivos y directorios.

Búsqueda de archivos a través del modo simbólico

Ahora que comprende el concepto de permisos de archivo, intente encontrar archivos a través del modo simbólico. El modo simbólico utiliza una combinación de letras y símbolos para representar los permisos de archivo.

Para demostrar cómo encontrar archivos a través del modo simbólico, ejecute cada uno de los siguientes comandos.

# Find only files (-type f) in the working directory (.) 
# with read, write and execute permissions for user, group and others in the current
find . -perm u=rwx,g=rwx,o=rwx -type f

# Find files (-type f) in the working directory (.) 
# with any of the read, write and execute permissions (not the exact)
# for user, group and others in the current
find . -perm -u=rwx,g=rwx,o=rwx -type f

# Find files (including hidden files) where either of the user, group or others 
# have read, write and execute access to files in the working directory (.)
find . -perm /u=rwx,g=rwx,o=rwx -type f

Búsqueda de archivos y directorios a través del modo absoluto

Si no prefiere buscar archivos a través del modo simbólico, entonces el modo absoluto puede despertar su interés. El modo absoluto define los permisos en representación numérica octal frente al uso de letras.

A continuación puede ver que el modo simbólico -rwxrwxrwx es equivalente al modo absoluto 777 .

Digamos que solo desea buscar archivos y directorios con permiso de solo lectura para usuarios, grupos y otros. Si es así, ejecute cada uno de los comandos a continuación para ver los resultados que obtendrá al buscar archivos y directorios a través del modo absoluto.

# Find files and directories only with read-only permission 
# for user, group and others in the working directory (.)
find . -perm 444

# Find files and directories only that have least the read-only permission 
# for user, group and others in the working directory (.)
find . -perm -444

# Find files and directories only (including hidden files and directories) 
# that have least the read-only permission 
# for user, group and others in the working directory (.)
find . -perm /444

Modificar la salida de resultados de búsqueda con el -print Parámetro

En lugar de solo mostrar las rutas de los archivos en el resultado de la búsqueda, quizás también desee ver sus propiedades. Usando el -print acción, puede modificar la salida el find el comando produce.

El -print El parámetro es el comportamiento predeterminado cuando ejecuta el find donde imprime el resultado de la búsqueda de archivos, cada uno en una nueva línea. Entonces, ejecute cualquiera de los comandos a continuación para find archivos y directorios llamados snap , obtendrás el mismo resultado.

find -name "snap" -print
find -name "snap"

Buscar e imprimir nombres de archivos sin espacios en blanco

A diferencia del predeterminado -print parámetro, el -print0 La opción le permite borrar espacios en blanco o caracteres de nueva línea en un resultado de búsqueda devuelto por el find dominio. Especialmente cuando estás pasando el resultado a otro comando como grep para buscar patrones.

El siguiente comando le permite buscar y generar un directorio sin espacios en blanco ni caracteres de nueva línea.

# Find a file or directory named 'snap', print the result
# removing white spaces and newline characters
find -name "snap" -print0

Buscar e imprimir archivos con propiedades mediante formato de impresión

Para cambiar el formato de la salida, el find el comando también tiene un -printf parámetro. Este parámetro le permite crear directivas o "formateadores" que definen cómo se verá el resultado de la búsqueda.

Tal vez necesite encontrar archivos junto con sus propiedades como la última vez que se accedió a ellos. Si es así, ejecute los siguientes comandos.

# Find files only with names starting with 'snap', then print each file 
# along with their last-time access properties, full path and filename
# each on a new line
find -name "snap*" -printf "%a %p \n"

# Find files with .html or .json extension 
# then print each file owner's username, group name, full path and filename
# each on a new line
find \( -name "*.html" -type f \) -or -name "*.json" -printf "%u %g %p \n"

A continuación se muestra una lista de directivas disponibles para trabajar codo con codo con el -printf acción:

  • %a – Devuelve la última vez que se accedió a un archivo.
  • %b – Devuelve la cantidad de espacio en disco utilizado para un archivo en bloques de 512 bytes.
  • %d – Devuelve la profundidad de un archivo en el árbol de directorios.
  • %g – Devuelve el nombre de grupo de un archivo o el ID de grupo numérico si el grupo no tiene nombre.
  • %k – Devuelve la cantidad de espacio en disco utilizado para un archivo en bloques de 1K.
  • %m – Devuelve los bits de permiso de un archivo (en octal).
  • %p – Devuelve el nombre de archivo exacto de un archivo.
  • %s – Devuelve el tamaño de un archivo en bytes.
  • %t – Devuelve la hora de la última modificación de un archivo en el formato devuelto por el -ctime opción.
  • %u – Devuelve el nombre de usuario del propietario del archivo o el ID de usuario numérico si el usuario no tiene nombre.

Limitación de la profundidad de búsqueda de archivos

Quizás desee acotar más y limitar la búsqueda en directorios; necesitarás usar el -maxdepth opción con el find comando, como se muestra a continuación.

El -maxdepth parámetro le dice al find Comando para limitar el alcance de la búsqueda a solo un cierto número de subdirectorios en el árbol de directorios.

# Find files and directories one step down from the working directory
find . -maxdepth 1 -name "chart*"

# Find files and directories two steps down from the ~/chart directory
find ~/chart -maxdepth 2 -name "chart"

Buscar archivos limitados al directorio de trabajo con -prune Opción

Si necesita limitar una búsqueda solo al directorio de trabajo actual y no recurrir a ningún subdirectorio, consulte el -prune parámetro.

En el siguiente comando, find archivos y directorios cuyos nombres (-name ) no comience con snap y está limitado (-prune ) al directorio de trabajo (. ).

Para obtener resultados de búsqueda de archivos y carpetas con nombres que comienzan en snap en su lugar, elimine el -or operador y -print action , así:find . -name "snap*" -prune

find . -name "snap*" -prune -or -print

Búsqueda de archivos y directorios a través del último acceso

La poda de archivos particulares seguramente reduce el resultado de la búsqueda. Pero, ¿qué sucede si lo único que recuerda sobre el archivo que está buscando es la última vez que accedió a ese archivo? Bueno, la buena noticia es que el comando de búsqueda le permite buscar archivos y directorios a través de su último acceso. ¡Vamos a sumergirnos!

Búsqueda de archivos a través del acceso del último día del archivo

Digamos que aún recuerdas el último día que accediste a un archivo o directorio, entonces el -atime opción combinada con el find comando es todo lo que necesita, como se demuestra a continuación. Si la última vez que se accedió a un archivo no se encuentra dentro del valor que especificó, el find El comando devuelve un valor falso y omite ese archivo.

# Find files and directories you last accessed between 2-3 days ago
find -atime 2

# Find files and directories you last accessed within the past 2 days
find -atime -2

# Find files and directories you last accessed within the past day
find -atime 0

Quizás también desee ver la última vez que accedió a un archivo o directorio, luego agregue el -printf acción con directivas. La siguiente línea de comando le permite find archivos a los que se accedió el día anterior (-atime 0 ). Luego el -printf La acción muestra la última vez que se accedió (%a ) de archivos o directorios y los nombres de archivo (%p ), cada uno en una nueva línea (\n ), como se muestra a continuación.

find -atime 2 -printf "%a %p \n"

Búsqueda de archivos a través del acceso de último minuto del archivo

Digamos que necesita encontrar archivos basados ​​en el minuto. Como el -atime opción, el -amin funciona igual. Pero en su lugar, obtendrá resultados de búsqueda de archivos filtrados por su último acceso según el valor que especificó, como se muestra a continuación.

# Find files and directories accessed within the past 40 minutes
# Not ideal most of the time as you will get result of tons of files and directories
find -amin 40

# Find directories accessed within the past 40 minutes
find -name "snap*" -type d -amin -40

# Find files accessed within the past 40 minutes
find -name "snap*" -type f -amin -40

Búsqueda de archivos y directorios a través del último cambio

Encontrar archivos o directorios a través del último acceso puede generar toneladas de resultados, lo que parecería confuso si los nombres de los archivos son similares. Entonces, para reducir aún más el resultado de la búsqueda, vaya con -ctime opción en su lugar. El -ctime La opción filtra el resultado de la búsqueda por la última vez que realizó cambios en el archivo o directorio en función de un valor específico (en los últimos días).

Tal vez desee buscar archivos que modificó hace dos días. Si es así, ejecute los comandos de muestra a continuación.

# Find files and directories you modifed in the past two days
find -ctime -2

# Find files and directories with names starting with 'snap'
# which you modifed in the past two days
find -name "snap*" -ctime -2

Ejecutar un comando después de encontrar un archivo o directorio

El find el comando no solo encuentra archivos y directorios; también puede ejecutar comandos justo después de mostrar los resultados de búsqueda usando el -exec parámetro. Esta característica es excelente para cuando desea abrir un archivo en un editor de texto o eliminar un archivo o directorio una vez encontrado, por ejemplo.

Asegúrese de escapar de los puntos y comas (; ) con una barra invertida (\ ) para evitar su interpretación.

# Find a file named 'snap.doc' then open the file in vi editor
find -name "snap.doc" -exec vi {} \;

# Find a file named 'snap.doc' then remove the file
find -name "snap.doc" -exec rm {} \;

Eliminar archivos y directorios con -delete Acción

El find El comando no solo te permite encontrar archivos como has aprendido hasta ahora. El find El comando también le brinda la opción de eliminar un archivo automáticamente una vez que se encuentra. Tal vez necesite eliminar archivos o directorios vacíos con un nombre específico o que coincidan con un patrón específico. Luego el find comando con el -delete la acción definitivamente será útil.

Para demostrar la eliminación de archivos y directorios con el -delete acción, primero cree un directorio y un archivo. A continuación, las líneas de comando le permiten crear (mkdir ) un directorio llamado (thanos ), luego un archivo llamado snap dentro del thanos directorio.

mkdir thanos
touch thanos/snap

El -delete La acción solo elimina directorios vacíos. Entonces, si intenta eliminar el thanos directorio con la línea de comando a continuación, recibirá un mensaje que dice buscar:no se puede eliminar 'thanos':el directorio no está vacío.

Para eliminar un solo archivo (snap ), especifica el -type prueba cuando ejecutas el comando de búsqueda, así:find "snap" -type f -delete

# Find a directory named 'thanos', then delete the directory
# This command fails since the 'thanos' directory is not empty
find "thanos" -type d -delete

# Find a file named 'thanos.snap', then delete the file
find "thanos.snap" -type f -delete

Para eliminar el ~/thanos directorio, aplique el -depth opción, como se muestra a continuación. El find el comando buscará el thanos directorio y eliminar recursivamente (-delete ) el contenido de ~/thanos directorio y eliminar el directorio mismo.

find "thanos" -depth -delete

Conclusión

Este artículo tiene como objetivo enseñarle diferentes formas de cómo el comando Bash find le permite ubicar archivos, obtener propiedades de archivos e incluso modificar una salida en ciertos formatos. Antes, encontrar un archivo perdido estaba lleno de obstáculos en el camino. Pero ahora, puedes saltar los obstáculos e ir directamente a la línea de meta. ¿Es eso considerado hacer trampa?

Bueno, independientemente del método con el que intentaste encontrar tu archivo, ¡la experiencia seguramente es satisfactoria! Entonces, ¿qué prueba, acción u opción te pareció más interesante?


Linux
  1. Búsqueda de archivos en la línea de comandos (instrucciones)

  2. Cómo auditar permisos con el comando de búsqueda

  3. Cómo encontrar archivos en CentOS 8 en la línea de comandos

  4. Cómo encontrar archivos con el comando fd en Linux

  5. Cómo usar el comando find de Linux para buscar archivos

Cómo usar el comando de lectura Bash

Cómo encontrar archivos en Linux con el comando Buscar

Cómo encontrar archivos en la línea de comandos de Ubuntu

Cómo encontrar archivos con el comando fd en Linux

Manera fácil de fusionar archivos con el comando Cat

¿Cómo averiguar los principales directorios o archivos que consumen espacio?