Buscar..


Introducción

find es un comando para buscar recursivamente en un directorio los archivos (o directorios) que coinciden con un criterio, y luego realizar alguna acción en los archivos seleccionados.

encontrar search_path selection_criteria acción

Sintaxis

  • encontrar [-H] [-L] [-P] [-D debugopts] [-Olevel] [ruta ...] [expresión]

Buscando un archivo por nombre o extensión

Para buscar archivos / directorios con un nombre específico, relativo a pwd :

$ find . -name "myFile.txt"
./myFile.txt

Para encontrar archivos / directorios con una extensión específica, use un comodín:

$ find . -name "*.txt"
./myFile.txt
./myFile2.txt

Para encontrar archivos / directorios que coincidan con una de las muchas extensiones, use el indicador or :

$ find . -name "*.txt" -o -name "*.sh"

Para buscar archivos / directorios cuyo nombre comience con abc y termine con un carácter alfa siguiendo un dígito:

$ find . -name "abc[a-z][0-9]"

Para encontrar todos los archivos / directorios ubicados en un directorio específico

$ find /opt

Para buscar solo archivos (no directorios), use -type f :

find /opt -type f

Para buscar solo directorios (no archivos normales), use -type d :

find /opt -type d

Buscando archivos por tipo

Para encontrar archivos, use la -type f

$ find . -type f

Para encontrar directorios, use la -type d

$ find . -type d

Para encontrar dispositivos de bloque, use la -type b

$ find /dev -type b

Para encontrar enlaces simbólicos, use la bandera -type l

$ find . -type l

Ejecutando comandos contra un archivo encontrado

A veces necesitaremos ejecutar comandos contra muchos archivos. Esto se puede hacer usando xargs .

find . -type d -print | xargs -r chmod 770

El comando anterior buscará recursivamente todos los directorios ( -type d ) relativos a . (que es su directorio de trabajo actual), y ejecute chmod 770 en ellos. La opción -r especifica a xargs para no ejecutar chmod si find no encontró ningún archivo.

Si los nombres de sus archivos o directorios tienen un carácter de espacio en ellos, este comando puede bloquearse; una solución es usar lo siguiente

find . -type d -print0 | xargs -r -0 chmod 770

En el ejemplo anterior, las -print0 y -0 especifican que los nombres de los archivos se separarán mediante un byte null , y permite el uso de caracteres especiales, como espacios, en los nombres de los archivos. Esta es una extensión GNU y puede que no funcione en otras versiones de find y xargs .


La forma preferida de hacerlo es omitir el comando xargs y dejar que find llame al subproceso en sí:

find . -type d -exec chmod 770 {} \;

Aquí, {} es un marcador de posición que indica que desea utilizar el nombre del archivo en ese punto. find ejecutará chmod en cada archivo individualmente.

Alternativamente, puede pasar todos los nombres de archivos a una sola llamada de chmod , usando

find . -type d -exec chmod 770 {} +

Este es también el comportamiento de los fragmentos de xargs anteriores. (Para llamar a cada archivo individualmente, puede usar xargs -n1 ).


Una tercera opción es dejar que bash se desplace por la lista de nombres de archivos para find resultados:

find . -type d | while read -r d; do chmod 770 "$d"; done

Esto es sintácticamente el más torpe, pero conveniente cuando quiere ejecutar múltiples comandos en cada archivo encontrado. Sin embargo, esto no es seguro en vista de los nombres de archivos con nombres impares.

find . -type f | while read -r d; do mv "$d" "${d// /_}"; done

que reemplazará todos los espacios en los nombres de archivo con guiones bajos. (Este ejemplo tampoco funcionará si hay espacios en los nombres de directorio principales).

El problema con lo anterior es que, while read -r espera una entrada por línea, los nombres de los archivos pueden contener nuevas líneas (y también, la read -r perderá cualquier espacio en blanco al final). Puedes arreglar esto cambiando las cosas:

find . -type d -exec bash -c 'for f; do mv "$f" "${f// /_}"; done' _ {} +

De esta manera, el -exec recibe los nombres de los archivos en una forma que es completamente correcta y portátil; bash -c recibe como una serie de argumentos, que se encontrarán en $@ , correctamente citados, etc. (El script deberá manejar estos nombres correctamente, por supuesto; cada variable que contenga un nombre de archivo debe estar en doble citas.)

El misterioso _ es necesario porque el primer argumento para bash -c 'script' se usa para rellenar $0 .

Encontrar el archivo por tiempo de acceso / modificación

En un sistema de archivos ext , cada archivo tiene asociado un stat myFile.txt Acceso, Modificación y Cambio (Estado), para ver esta información puede usar stat myFile.txt ; utilizando indicadores dentro de find , podemos buscar archivos que fueron modificados dentro de un cierto rango de tiempo.

Para buscar archivos que han sido modificados en las últimas 2 horas:

$ find . -mmin -120

Para buscar archivos que no hayan sido modificados en las últimas 2 horas:

$ find . -mmin +120

El ejemplo anterior se busca sólo en la hora de modificación - para buscar en un momento cceso, o c colgado veces, utilizar a o c en consecuencia.

$ find . -amin -120
$ find . -cmin +120

Formato general:

-mmin n : el archivo fue modificado hace n minutos
-mmin -n : el archivo se modificó hace menos de n minutos
-mmin +n : el archivo se modificó hace más de n minutos


Buscar archivos que han sido modificados en los últimos 2 días:

find . -mtime -2

Encuentre archivos que no hayan sido modificados en los últimos 2 días.

find . -mtime +2

Use -atime y -ctime para el tiempo de acceso y el tiempo de cambio de estado, respectivamente.

Formato general:

-mtime n : el archivo fue modificado nx24 horas atrás
-mtime -n : el archivo se modificó hace menos de 24 horas
-mtime +n : el archivo se modificó hace más de 24 horas

Encuentre archivos modificados en un rango de fechas , del 2007-06-07 al 2007-06-08:

find . -type f -newermt 2007-06-07 ! -newermt 2007-06-08  

Encuentre los archivos a los que se accede en un rango de marcas de tiempo (usando archivos como marca de tiempo), desde hace 1 hora hasta hace 10 minutos:

touch -t $(date -d '1 HOUR AGO' +%Y%m%d%H%M.%S) start_date
touch -t $(date -d '10 MINUTE AGO' +%Y%m%d%H%M.%S) end_date
timeout 10 find "$LOCAL_FOLDER" -newerat "start_date" ! -newerat "end_date" -print  

Formato general:

-newerXY reference : compara la marca de tiempo del archivo actual con la referencia. XY podría tener uno de los siguientes valores: at (tiempo de acceso), mt (tiempo de modificación), ct (tiempo de cambio) y más. reference es el nombre de un archivo cuando queremos comparar la marca de tiempo especificada (acceso, modificación, cambio) o una cadena que describe un tiempo absoluto.

Buscando archivos por extensión específica

Para encontrar todos los archivos de una cierta extensión dentro de la ruta actual, puede usar la siguiente sintaxis de find . Funciona haciendo uso de bash's construcción glob integrada de bash's para que coincida con todos los nombres que tienen la .extension .

find /directory/to/search -maxdepth 1 -type f -name "*.extension"

Para encontrar todos los archivos de tipo .txt desde el directorio actual solo, haga

find . -maxdepth 1 -type f -name "*.txt"

Encontrar archivos de acuerdo al tamaño.

Encuentra archivos de más de 15MB:

find -type f -size +15M

Encuentra archivos de menos de 12KB:

find -type f -size -12k

Encuentra archivos exactamente del tamaño de 12KB:

find -type f -size 12k

O

find -type f -size 12288c

O

find -type f -size 24b

O

find -type f -size 24

Formato general:

find [options] -size n[cwbkMG]

Encuentre archivos de tamaño n-block, donde + n significa más que n-block, -n significa menos que n-block y n (sin ningún signo) significa exactamente n-block

Tamaño de bloque:

  1. c : bytes
  2. w : 2 bytes
  3. b : 512 bytes (por defecto)
  4. k : 1 KB
  5. M : 1 MB
  6. G : 1 GB

Filtrar el camino

El parámetro -path permite especificar un patrón para que coincida con la ruta del resultado. El patrón puede coincidir también con el nombre en sí.

Para buscar solo archivos que contengan log en cualquier lugar de su ruta (carpeta o nombre):

find . -type f -path '*log*'

Para buscar solo archivos dentro de una carpeta llamada log (en cualquier nivel):

find . -type f -path '*/log/*'

Para buscar solo archivos dentro de una carpeta llamada log o data :

find . -type f -path '*/log/*' -o -path '*/data/*'

Para buscar todos los archivos excepto los que se encuentran en una carpeta llamada bin :

find . -type f -not -path '*/bin/*'

Para buscar todos los archivos, todos los archivos excepto los que se encuentran en una carpeta llamada bin o archivos de registro:

find . -type f -not -path '*log' -not -path '*/bin/*'


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow