¿Cómo se actualiza mucho más rápido que find?

11

¿Cómo es updatedbmucho más rápido que find?

Aquí hay una comparación cronometrada entre updatedby un findcomando que realiza una tarea aparentemente similar.

compare.sh

#!/usr/bin/env bash

cmd="sudo updatedb"
echo $cmd
time eval $cmd

cmd="sudo find / \
    -fstype ext4 \
    -not \( \
        -path '/afs/*' -o \
        -path '/net/*' -o \
        -path '/sfs/*' -o \
        -path '/tmp/*' -o \
        -path '/udev/*' -o \
        -path '/var/cache/*' -o \
        -path '/var/lib/pacman/local/*' -o \
        -path '/var/lock/*' -o \
        -path '/var/run/*' -o \
        -path '/var/spool/*' -o \
        -path '/var/tmp/*' -o \
        -path '/proc/*' \
    \) &>/dev/null"

echo $cmd
time eval $cmd

Mi /etc/updatedb.conf:

PRUNE_BIND_MOUNTS = "yes"
PRUNEFS = "9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset cramfs debugfs devpts devtmpfs ecryptfs exofs ftpfs fuse fuse.encfs fuse.sshfs fusectl gfs gfs2 hugetlbfs inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfs nfs4 nfsd pipefs proc ramfs rootfs rpc_pipefs securityfs selinuxfs sfs shfs smbfs sockfs sshfs sysfs tmpfs ubifs udf usbfs vboxsf"
PRUNENAMES = ".git .hg .svn"
PRUNEPATHS = "/afs /net /sfs /tmp /udev /var/cache /var/lib/pacman/local /var/lock /var/run /var/spool /var/tmp"

Para el comando find acabo de especificar el ext4sistema de archivos porque ese es el único sistema de archivos que updatedbdebería terminar buscando. No me molesté con las extensiones de archivo y no sé cómo excluir un montaje de enlace, findpero no tengo ninguno. También agregué una exclusión para '/ proc' que parece updatedbignorar. También debería haber ignorado '/ sys'.

Si hubiera alguna diferencia, esperaría que el comando find sea un poco más rápido ya que sus reglas son un poco más simples y no tiene que escribir en el disco. En cambio updatedbes mucho más rápido.

$ ./compare.sh
sudo updatedb

real    0m0.876s
user    0m0.443s
sys 0m0.273s

sudo find / -fstype ext4 -not \( -path '/afs/*' -o -path '/net/*' -o -path '/sfs/*' -o -path '/tmp/*' -o -path '/udev/*' -o -path '/var/cache/*' -o -path '/var/lib/pacman/local/*' -o -path '/var/lock/*' -o -path '/var/run/*' -o -path '/var/spool/*' -o -path '/var/tmp/*' -o -path '/proc/*' \) &>/dev/null

real    6m23.499s
user    0m14.527s
sys 0m10.993s

¿Qué están haciendo de manera diferente?

Praxeolítico
fuente
use set -xpara activar la impresión de comandos antes de que se ejecuten, por lo que no necesita las travesuras de evaluación.
Peter Cordes

Respuestas:

15

Consulte la página de manual para updatedb"Si la base de datos ya existe, sus datos se reutilizan para evitar volver a leer directorios que no han cambiado".

Mientras que el findcomando atraviesa todos los directorios independientemente de si han cambiado.

Steve
fuente
1
Cómo es posible verificar tal cosa: stackoverflow.com/questions/3620684/…
Praxeolitic