encontrar vs localizar

30

Existen los comandos findy locatepara buscar archivos en el disco.

Sé que findprocesa recursivamente todos los subdirectorios necesarios para buscar archivos y, por lo tanto, es lento pero está actualizado, mientras que locateusa una base de datos que se actualiza de vez en cuando (¿cuándo exactamente?) Para mostrar rápidamente resultados que pueden estar desactualizados.

¿Hay otras diferencias? ¿En qué situaciones uno preferiría el uno o el otro? ¿Y cuándo locatese actualiza la base de datos habitualmente?

Byte Commander
fuente
1
manpages.ubuntu.com/manpages/trusty/man8/updatedb.8.html " actualizadob normalmente se ejecuta diariamente por cron (8) para actualizar la base de datos predeterminada".
Rinzwind
@Rinzwind La respuesta de U&L vinculada es increíble, es una pena que no podamos hacer duplicados entre sitios. Pero, ¿sabes más sobre el cronjob, cuándo exactamente se ejecutará? Después del inicio? ¿En un momento específico (creo que he leído 1-2AM o algo así) solamente? ¿Qué sucede si se cierra en ese momento? ¿Comienza cuando la computadora está inactiva? ¿Cómo puedo ver la edad de la base de datos?
Byte Commander
2
@ByteCommander: para eso anacronestá. No sé si está instalado de forma predeterminada en los sistemas / servidores de escritorio, pero está en los portátiles. Se ejecuta al arrancar y ve si algún trabajo cron debería haberse ejecutado mientras el sistema estaba apagado y lo ejecuta. Es realmente útil, pero puede causar algunos problemas si tiene trabajos programados lejos de la medianoche. Eso puede hacer que el trabajo se ejecute al arrancar y luego nuevamente cuando llegue el momento, posiblemente mucho menos de 24 horas después (para un trabajo diario)
Joe
@ Joe Entonces, ¿se ejecutará durante el arranque y se ralentizará, o se ejecutará algún tiempo después del arranque, o generalmente se ejecuta con una prioridad tan baja que solo se ejecuta cuando el sistema está casi inactivo?
Byte Commander

Respuestas:

27

locatees realmente solo bueno para encontrar archivos y mostrarlos a los humanos. Puede hacer algunas cosas con él, pero no confiaría lo suficiente como para analizarlo y, como usted dice, es imposible garantizar el estado de la base de datos interna, ¡más aún porque solo está programada para ejecutarse /etc/cron.daily/mlocate, una vez al día!

findes en vivo. Filtra, excluye, ejecuta. Es adecuado para analizar. Puede generar rutas relativas. Puede generar rutas completas. Puede hacer cosas basadas en atributos, no solo en nombres.

locateciertamente tiene un lugar en mi caja de herramientas, pero generalmente está justo en la parte inferior como un último esfuerzo para encontrar algo. Es más fácil que findtambién.

Oli
fuente
2
Me parece locatemucho más rápido si quiero buscar en todo mi sistema de archivos. Y puede actualizar manualmente la base de datos usando updatedbantes de usarla.
hytromo
¿Sabes cómo ese cronjob está configurado exactamente? ¿Se ejecuta a una hora específica o cuando el sistema está inactivo o n minutos después del inicio? Porque creo que he leído en alguna parte que está programado para las 1 a. M. ¿Nunca se actualizará entonces, excepto manualmente ( sudo updatedb)? ¿Y existe la posibilidad de ver la antigüedad de la base de datos?
Byte Commander
grep run-parts /etc/crontabVerá que estos se están administrando a través de anacron(lo que verá man anacrones más resistente a los sistemas que no están en todo momento). Por lo que puedo ver, debería ejecutarlo en el arranque si se pierde el tiempo cron original.
Oli
2
Encuentro que localizar no indexa mis particiones desmontables / desmontadas, por lo que si quiero encontrar algo en ellas, tengo que usar find. Por supuesto, localizar no tiene todas las opciones increíbles que encuentra, como -exec command {} \;ejecutar un comando en cada archivo encontrado. Me gusta usar el locate -bque restringe la localización para encontrar archivos que coincidan con el componente final del nombre, sin el resto de la ruta. A menudo lo intento primero porque es muy rápido. Además, puede ejecutar en sudo updatedbcualquier momento que desee actualizar la base de datos de localización.
Joe
si necesita una búsqueda en tiempo real que también sea algo fácil, puede usar algo comols -R | grep 'file_name.txt'
jena
9

Por mucho que me guste Oli (¡lo cual es mucho!) No estoy de acuerdo con él en el findcomando. No me gusta

find el comando lleva más de tres minutos

Tome por ejemplo este simple comando:

$ time find / -type f -name "mail-transport-agent.target"
find: ‘/lost+found’: Permission denied
find: ‘/etc/ssmtp’: Permission denied
find: ‘/etc/ssl/private’: Permission denied
    (... SNIP ...)
find: ‘/run/user/997’: Permission denied
find: ‘/run/sudo’: Permission denied
find: ‘/run/systemd/inaccessible’: Permission denied

real    3m40.589s
user    0m4.156s
sys     0m8.874s

Se tarda más de tres minutos para findbuscar todo a partir de /. Por defecto, aparecen montones de mensajes de error y debe buscarlos para encontrar lo que está buscando. Aún así, es mejor que grepbuscar en todo el disco una cadena que demore 53 horas : `grep` todos los archivos para una cadena lleva mucho tiempo

Sé que puedo jugar con los parámetros del comando find para que funcione mejor, pero el punto aquí es la cantidad de tiempo que tarda en ejecutarse.

locate el comando lleva menos de un segundo

Ahora usemos locate:

$ time locate mail-transport-agent.target
/lib/systemd/system/mail-transport-agent.target

real    0m0.816s
user    0m0.792s
sys     0m0.024s

¡El comando de localización toma menos de un segundo!

updatedb solo se ejecuta una vez al día de forma predeterminada

Es cierto que el updatedbcomando que actualiza la base de datos de localización solo se ejecuta una vez al día de forma predeterminada. Puede ejecutarlo manualmente antes de buscar los archivos que acaba de agregar usando:

$ time sudo updatedb

real    0m3.460s
user    0m0.503s
sys     0m1.167s

Aunque esto tomará 3 segundos, es pequeño en comparación con findlos más de 3 minutos del comando.

He actualizado mi sudo crontab -epara incluir la línea en la parte inferior:

# m h  dom mon dow   command
  0 0  1   *   *     /bin/journalctl --vacuum-size=200M
*/5 *  *   *   *     /usr/bin/updatedb

Ahora updatedbse ejecuta cada cinco minutos y la locatebase de datos de comandos está casi siempre actualizada.

Pero no hay atributos?

Puede canalizar la locatesalida a otros comandos. Si, por ejemplo, desea los atributos de archivo que puede usar:

$ locate mail-transport-agent.target | xargs stat
  File: '/lib/systemd/system/mail-transport-agent.target'
  Size: 473         Blocks: 8          IO Block: 4096   regular file
Device: 10305h/66309d   Inode: 667460      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-03-31 18:11:55.091173104 -0600
Modify: 2017-10-27 04:11:45.000000000 -0600
Change: 2017-10-28 07:18:24.860065653 -0600
 Birth: -

Resumen

Publiqué esta respuesta para mostrar la velocidad y facilidad de uso de locate. Traté de abordar algunas de las deficiencias de comando señaladas por otros.

El findcomando necesita atravesar toda la estructura del directorio para encontrar archivos. El locatecomando tiene su propia base de datos que le da la velocidad del rayo en comparación.

WinEunuuchs2Unix
fuente
@EliahKagan Pero el comando de búsqueda se desplazaba y enumeraba todos los directorios y archivos en todas las unidades y particiones. Parecía estar funcionando y esperaba una impresión al final ... De cualquier manera, no se trataba de "arreglar" la búsqueda del comando de búsqueda, sino de obtener el tiempo. La ejecución locate / display-auto-brightnessdura 17 segundos y también muestra todos los directorios y archivos en todos los discos.
WinEunuuchs2Unix
@EliahKagan, entiendo. --regexera necesario porque había demasiados resultados devueltos con mi cadena de búsqueda. Encontraré dos nuevos ejemplos para buscar y localizar y actualizar mi respuesta en unos minutos.
WinEunuuchs2Unix
1
Para aclarar el punto de Eliah, ese findcomando significa "imprimir los nombres de todos los archivos en los directorios /y display-auto-brightness". Creo que querías usar find / -name display-auto-brightness, pero incluso eso imprime muchos errores basura "Permiso denegado".
wjandrea
@wjandrea Sí, como dije, el punto no era encontrar el archivo, sino cronometrar el comando de búsqueda. Estoy volviendo a ejecutar pruebas ahora con parámetros válidos después de vaciar cachés. Entonces actualizaré la respuesta.
WinEunuuchs2Unix
1
@Win No, su ejemplo sigue siendo válido, y no creo que el tiempo de procesamiento cambie mucho si se encuentra el archivo o no.
wjandrea 01 de