locate/whereis/which 和有什么不一样

Chi*_*a B 14 command-line search unity-dash locate

locate whereiswhich命令之间的基本区别是什么。

我观察到的基本区别是,locate定位所有相关的文件名称在整个文件系统,而whereiswhich命令只给安装应用程序的位置(文件系统/本地地址)。我的观察有多准确?

这些命令是如何在内部实现的。locate与破折号搜索相比,为什么工作如此之快,而locate必须在整个文件系统层次结构中搜索与目标字符串匹配的特定文件名?

Zan*_*nna 17

which查找程序的二进制可执行文件(如果它在您的 PATH 中)。man which解释得更清楚:

它返回将在当前环境中执行的文件(或链接)的路径名,如果它的参数在严格符合 POSIX 的 shell 中作为命令给出。它通过在 PATH 中搜索与参数名称匹配的可执行文件来实现这一点。它不遵循符号链接。

whereis查找程序的二进制文件、源代码和手册页文件。例如

$ whereis gimp
/usr/bin/gimp /usr/lib/gimp /etc/gimp /usr/share/gimp /usr/share/man/man1/gimp.1.gz
Run Code Online (Sandbox Code Playgroud)

您可以通过将这些命令的输出作为参数传递给ls -lfile

$ ls -l $(which gimp)
lrwxrwxrwx 1 root root 8 Jun 30 19:59 /usr/bin/gimp -> gimp-2.8

$ file $(which gimp)
/usr/bin/gimp: symbolic link to gimp-2.8
Run Code Online (Sandbox Code Playgroud)

locate确实找到所有在其路径中的任何位置指定了模式的文件。您可以告诉它只查找名称(而不是完整路径)包含带有-b选项的模式的文件和目录,这通常是您想要的,并提供一个不那么笨拙的列表。

locate速度很快,因为它使用定期更新的二进制数据库(每天一次,由cron)。您可以自己更新它以确保通过运行找到最近添加的文件sudo updatedb

还有一件事locate- 它不关心文件是否仍然存在,因此为了避免查找最近删除的文件,请使用-e. 通常我也会用管道发送,less因为列表可能很长。通常我会这样做:

sudo updatedb && locate -b -e gimp | less
Run Code Online (Sandbox Code Playgroud)

这里解释Unity 的 dash 是如何工作的——它使用Zeitgeist来索引系统文件并从使用模式中学习,并使其他应用程序能够使用这些数据,因此它比locate.

  • @Creator 自动更新数据库由 cron 完成,每天一次。您可以在安装某些无法立即使用“locate”的文件时进行检查。破折号使用完全不同的索引 - 速度较慢,因为它做了更多的事情(我编辑了我的答案) (2认同)