Як це updatedb
набагато швидше, ніж find
?
Ось приурочене порівняння між командою updatedb
та find
командою, яка виконує, здавалося б, подібне завдання.
порівняти.ш
#!/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
Мій /etc/updateb.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"
Для команди find я тільки що вказав ext4
файлову систему, тому що це єдина файлова система, яка updatedb
повинна переглядати. Я не турбувався з розширеннями файлів і не знаю, як виключити кріплення прив’язки, find
але у мене немає. Я також додав виключення для "/ proc", яке, здається, updatedb
ігнорує. Я також повинен був проігнорувати '/ sys'.
Якщо буде якась різниця, я б очікував, що команда find буде трохи швидшою, оскільки правила трохи простіші, і вона не повинна записувати на диск. Натомість updatedb
набагато швидше.
$ ./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
Що вони роблять по-іншому?
set -x
для ввімкнення друку команд перед їх виконанням, тому вам не знадобляться шваляни.