updatedb
왜 그렇게 더 빨라 졌나요 find
?
다음은 유사해 보이는 작업을 수행하는 명령 updatedb
간의 타이밍 비교 입니다.find
비교.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"
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
그들은 어떻게 다르게 합니까?
답변1
updatedb
"데이터베이스가 이미 존재하는 경우 변경되지 않은 디렉토리를 다시 읽지 않도록 해당 데이터를 재사용하십시오" 매뉴얼 페이지를 참조하십시오 .
그리고 이 find
명령은 변경 여부에 관계없이 모든 디렉터리를 반복합니다.