查找与定位

Byt*_*der 35 find locate

有命令findlocate来搜索磁盘上的文件。

我知道find递归处理所有需要的子目录来搜索文件,因此速度很慢但是是最新的,而locate使用一个不时更新的数据库(确切的时间?)来快速显示可能已经过时的结果。

还有其他区别吗?在哪种情况下,人们会更喜欢一种还是另一种?locate数据库通常什么时候更新?

Oli*_*Oli 29

locate真的只适用于查找文件并将其显示给人类。你可以用它做一些事情,但我不会相信它足以解析,而且——正如你所说——不可能保证内部数据库的状态,更重要的是因为它只计划从 开始/etc/cron.daily/mlocate,每天运行一次!

find是活的。它过滤、排除、执行。它适合解析。它可以输出相对路径。它可以输出完整路径。它可以根据属性做事,而不仅仅是名字。

locate在我的工具箱中肯定有一席之地,但它通常位于底部,作为寻找某些东西的最后努力。它比find太容易。

  • 如果我想搜索整个文件系统,我发现 `locate` 会快得多。您可以在使用之前使用 `updatedb` 手动更新数据库。 (2认同)
  • 我发现 locate 没有索引我的可移动/卸载分区,所以如果我想在它们上面找到一些东西,我必须使用 find。当然, locate 并没有 find 具有的所有惊人选项 - 例如`-exec command {} \;` 对找到的每个文件运行命令。我确实喜欢使用 `locate -b` 来限制 locate 查找与名称的最终组成部分匹配的文件 - 没有路径的其余部分。我经常先尝试,因为它太快了。此外,您可以随时运行 `sudo updatedb` 来刷新定位数据库。 (2认同)

Win*_*nix 11

尽管我喜欢 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
Run Code Online (Sandbox Code Playgroud)

它接管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
Run Code Online (Sandbox Code Playgroud)

定位命令只需要不到一秒钟!

updatedb 默认情况下每天只运行一次

确实,默认情况下updatedb,更新定位数据库的命令每天只运行一次。您可以在使用以下命令搜索刚刚添加的文件之前手动运行它:

$ time sudo updatedb

real    0m3.460s
user    0m0.503s
sys     0m1.167s
Run Code Online (Sandbox Code Playgroud)

虽然这将需要 3 秒,但与find命令的 3+ 分钟相比,它很小。

我已经更新了我的sudo crontab -e以包含底部的行:

# m h  dom mon dow   command
  0 0  1   *   *     /bin/journalctl --vacuum-size=200M
*/5 *  *   *   *     /usr/bin/updatedb
Run Code Online (Sandbox Code Playgroud)

现在每五分钟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: -
Run Code Online (Sandbox Code Playgroud)

概括

我发布了这个答案来展示locate. 我试图解决其他人指出的一些命令缺点。

find命令需要遍历整个目录结构来查找文件。该locate命令拥有自己的数据库,相比之下,它具有闪电般的速度。