查找与定位


30

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

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

还有其他区别吗?在哪种情况下,一个会偏爱另一个?locate数据库通常何时更新?



1
“ manpages.ubuntu.com/manpages/trusty/man8/updatedb.8.html ” updated通常由cron(8)每天运行,以更新默认数据库。“
Rinzwind

@Rinzwind链接的U&L答案很棒,我们无法跨站点重复,这真是遗憾。但是您是否了解cronjob的确切时间?启动后?仅在特定时间(我想我已经读过1-2AM或类似的内容)?如果当时关闭该怎么办?电脑闲置时是否启动?如何查看数据库的使用期限?
字节指挥官

2
@ByteCommander-这就是anacron目的。我不知道它是否默认安装在台式机系统/服务器上,但安装在笔记本电脑上。它在引导时运行,查看在系统关闭时是否应该运行任何cron作业并运行它们。这确实很有帮助,但是如果您安排的工作远离午夜,可能会导致一些问题。这可能会导致作业在启动时运行,然后在时间到时再次运行-可能少于24小时(对于日常工作)

@Joe那么它将在启动期间运行并使其速度降低,还是在启动后运行一段时间,或者它通常以较低的优先级运行,以至于它几乎在系统空闲时运行?
字节指挥官

Answers:


27

locate实际上仅对查找文件并将其显示给人类有用。您可以使用它做一些事情,但是我对它的解析不够信任,并且-正如您所说的-无法保证内部数据库的状态,而更是如此,因为它仅计划从/etc/cron.daily/mlocate每天运行一次!

find是活的。它过滤,排除,执行。适合解析。它可以输出相对路径。它可以输出完整路径。它可以基于属性而不只是名称来执行操作。

locate当然在我的工具箱中占有一席之地,但是通常在底部找到它是最后的努力。比这容易得多find


2
locate如果要搜索整个文件系统,我发现速度会更快。您可以updatedb在使用数据库之前使用来手动更新数据库。
hytromo

您知道该cronjob是如何配置的吗?它是在特定时间运行还是在系统空闲后或启动后n分钟运行?因为我想我已经阅读了安排在1-2AM(通常在我的机器通常关闭时)的某个地方。除非手动(sudo updatedb),否则永远不会更新吗?是否有机会查看数据库的历史记录?
字节指挥官

grep run-parts /etc/crontab您会看到它们是通过管理的anacron(您将看到man anacron它们对并非一直处于运行状态的系统更具弹性)。从我的看到,如果您错过了原始的cron时间,则应该在引导时运行它。
奥利(Oli)

2
我发现locate不会索引我的可移动/未安装分区,因此,如果我想在它们上查找内容,则必须使用find。当然,locate没有find拥有的所有令人惊奇的选项-就像-exec command {} \;在找到的每个文件上运行命令。我喜欢使用locate -bwhich来限制定位,以查找与名称的最后部分匹配的文件-无需其余路径。我经常先尝试一下,因为它是如此之快。此外,您可以在sudo updatedb任何时候刷新刷新定位数据库。

如果您需要也很容易的实时搜索,则可以使用类似的方法ls -R | grep 'file_name.txt'
jena

8

尽管我喜欢奥利(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秒,但与findCommand的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命令拥有自己的数据库,相比之下,它提供了闪电般的速度。


@EliahKagan但是find命令正在滚动浏览并列出分区的所有驱动器上的所有目录和文件。它似乎正在运行,并且我期望最后打印输出...两种方式都不是要“修复” find命令的搜索,而是要节省时间。运行locate / display-auto-brightness需要17秒钟,并且还会显示所有磁盘上的每个目录和文件。
WinEunuuchs2Unix

@EliahKagan我了解。--regex这是必要的,因为我的搜索字符串返回的结果太多。我将在几分钟后找到两个新的示例来查找,定位和更新我的答案。
WinEunuuchs2Unix

1
为了阐明Eliah的观点,该find命令的意思是“打印目录/和中所有文件的文件名display-auto-brightness”。我认为您打算使用find / -name display-auto-brightness,但即使这样也会打印出许多垃圾“ Permission被拒绝”错误。
wjandrea '18

@wjandrea是的,正如我所说的,并不是要查找文件,而是要为find命令计时。我现在在刷新缓存后使用有效参数重新运行测试。然后,我将更新答案。
WinEunuuchs2Unix

1
@Win不,您的示例仍然有效,并且我认为无论是否找到文件,处理时间都不会改变太多。
wjandrea
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.