尽管我喜欢奥利(Oli)(很多!),但我对他的find
命令持不同意见。我不喜欢
find
命令需要三分钟以上
以这个简单的命令为例:
$ 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
它接管3分钟用于find
从搜索开始的一切/
。默认情况下,会显示大量错误消息,您必须搜索它们以查找所需内容。仍然比grep
在整个驱动器中搜索一个字符串要花费53个小时要好:`grep`为一个字符串的所有文件都需要很长时间。
我知道我可以摆弄find命令的参数以使其更好地工作,但是这里要指出的是运行所花费的时间。
locate
命令花费不到一秒钟的时间
现在使用locate
:
$ time locate mail-transport-agent.target
/lib/systemd/system/mail-transport-agent.target
real 0m0.816s
user 0m0.792s
sys 0m0.024s
该定位命令只需要不到一秒钟!
updatedb
默认情况下每天仅运行一次
的确,默认情况下,每天只运行一次updatedb
更新定位数据库的命令。您可以使用以下命令手动运行它,然后再搜索刚刚添加的文件:
$ time sudo updatedb
real 0m3.460s
user 0m0.503s
sys 0m1.167s
尽管这将花费3秒,但与find
Command的3分钟以上相比,它很小。
我已经更新了我sudo crontab -e
的行,使其包括在底部:
# m h dom mon dow command
0 0 1 * * /bin/journalctl --vacuum-size=200M
*/5 * * * * /usr/bin/updatedb
现在每五分钟updatedb
运行一次,locate
命令数据库几乎总是最新的。
但是没有属性吗?
您可以将locate
输出通过管道传递给其他命令。例如,如果您想要文件属性,则可以使用:
$ 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: -
摘要
我发布了此答案,以显示的速度和易用性locate
。我试图解决其他人指出的一些命令缺陷。
该find
命令需要遍历整个目录结构以查找文件。该locate
命令拥有自己的数据库,相比之下,它提供了闪电般的速度。