Intereting Posts
Я хочу создать сценарий, чтобы мне не приходилось вводить su и пароль каждый раз Как я могу подсчитать количество повторений последовательности байтов в файле? Перенаправление вывода запущенного процесса через SSH в фоновом режиме Как уменьшить и удалить физический объем из активного логического тома? Какие оптимизированные инструменты доступны для сравнения содержимого каталога? Есть ли инструкция для команд, предоставляемых Debian? Использование оболочки «: -» и преимущества tmux эквивалентен экрану GNU: режим обертывания Для чтения значение sed для совпадения нуля или большего количества пробелов в строке Конвертировать порядок поиска … -exec Hewlett-Packard ScanJet 2200c на Scientific Linux 6.1 64bit Имитировать кабель ethernet, отсоединенный от удаленной машины, находясь на связи Сбросить настройки профиля терминала (без использования терминала) Debian установил очень низкое разрешение дисплея

Как обновляется так много быстрее, чем найти?

Как updatedb так много быстрее, чем find ?

Ниже приведено временное сравнение между updatedb и командой find которая выполняет, похоже, аналогичную задачу.

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 

Мой /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" системы 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 

Что они делают по-другому?

См. updatedb страницу для updatedb : «Если база данных уже существует, ее данные используются повторно, чтобы не перечитывать каталоги, которые не изменились».

Принимая во внимание, что команда find перемещает все каталоги независимо от того, были ли они изменены.