为什么 locate 命令找不到明显的文件?

Joh*_*ino 14 locate

locate 命令听起来很直观。我希望它能够在文件系统上定位文件。但是,它很少在系统上找到确实存在的文件:

$ locate ipsec.secrets
Run Code Online (Sandbox Code Playgroud)

即使从文件系统根目录 / 运行,这也不会产生任何结果。该文件确实存在:

$ whereis ipsec.secrets
ipsec: /usr/sbin/ipsec /etc/ipsec.secrets /etc/ipsec.d /etc/ipsec.conf /usr/lib/ipsec /usr/share/man/man8/ipsec.8.gz
Run Code Online (Sandbox Code Playgroud)

为什么 locate 找不到这个文件?

Jan*_*Jan 18

updatedb 每天只运行一次,您需要以 root 权限运行它才能找到最近的文件。


Has*_*tur 8

如果您无法访问明显存在locate的文件, 我只会看到两种可能性:

  1. 文件(目录)是在上次更新 locate 数据库之后创建的。默认情况下,它每天更新一次 ( /etc/cron.daily/mlocate)。
    拥有足够的特权,您可以修复它以强制更新

    sudo updatedb
    
    Run Code Online (Sandbox Code Playgroud)
  2. 该文件(目录)是在没有被 updatedb 扫描的路径下创建的(这种情况更罕见):您可以在配置文件中找到被修剪文件的键/etc/updatedb.conf。搜索 PRUNENAMES、PRUNEPATHS 或 PRUNEFS 并进行相应修改,然后再次更新数据库。

    sudo pico /etc/updatedb.conf
    sudo updatedb
    
    Run Code Online (Sandbox Code Playgroud)

当然,即使没有特权,您仍然可以搜索文件,例如从一个位置开始扫描所有目录和子目录,例如

find . -name '*ipsec.secrets*'  # to start from the current directory
find / -name '*ipsec.secrets*'  # to start from the root # long long 
Run Code Online (Sandbox Code Playgroud)

请注意,它whereis有一个硬编码的路径(搜索位置),因此可能无法始终找到您要查找的内容。