从定位手册页:
If --regex is not specified, PATTERNs can contain globbing characters. If any PATTERN contains no globbing characters, locate behaves as if the pattern were *PATTERN*.
现在,查看这些命令的输出:
test@ubuntu:~$ ls
Desktop Documents Downloads Firefox_wallpaper.png Music Pictures Public Templates Videos
test@ubuntu:~$
test@ubuntu:~$
test@ubuntu:~$ locate '/bin/bash*'
test@ubuntu:~$
test@ubuntu:~$
test@ubuntu:~$ locate /bin/bash*
/snap/core18/1880/bin/bash
/snap/core18/1880/usr/bin/bashbug
/snap/core18/1944/bin/bash
/snap/core18/1944/usr/bin/bashbug
/usr/bin/bash
/usr/bin/bashbug
如果您看到我当前的工作目录没有完整路径名以/bin/bash
. 因此,我们不应该从locate /bin/bash*
. 为什么 ?根据shell 的 globbing 特性,由于我当前的工作目录中没有这样的文件/目录,因此*
不会按原样扩展和传递。因此,它应该等同于 using locate '/bin/bash*'
(这是我们上面运行的第二个命令)。因为,这不接收任何输出,因此这locate /bin/bash*
也不应该给出输出?
不,这不是 shell globbing 的工作方式 -
/bin/bash*
匹配包括路径,因此如果它找到匹配项(即/bin/bash
),这就是locate
将接收的参数。您可以通过运行带有 shell 的-x
调试参数集的命令来验证这一点:由于(扩展的)模式不包含通配符,它等价于
*/bin/bash*
.更有趣的问题是为什么它没有找到
/bin/bash
自己,因为 shell 显然会 - 我认为这是因为在较新版本的 Ubuntu 上被符号链接 - 并且/bin
不记录符号链接。/usr/bin
updatedb
首先
该
locate
命令将提供的模式与其数据库匹配。这就是它的工作原理。这意味着两件事:无论您要查找什么,都必须在其数据库中,并且仅存在于您的文件系统中是不够的。数据库应定期更新,但有时需要时间,手动执行此操作的命令是
sudo updatedb
考虑到上述工作原理,它与您运行命令的
locate
目录没有任何区别,因为它本身不会搜索甚至查看当前目录。它只知道它的数据库。locate
locate
第二
当您传递包含通配符的未保护(未引用)模式来定位时,该模式不会传递给
locate
. 在这种情况下传递给locate
的是由 shell 本身完成的扩展版本,它可能包含各种后记将被视为多种模式的东西,locate
它将所有这些内容与其数据库进行比较并相应地打印输出。在这种情况下,您没有可靠的方法来控制传递给的内容locate
,这取决于 shell 来决定。防止外壳干扰和扩展带有通配字符的模式的正确方法是保护或转义这些字符。简而言之,在模式周围使用单引号或双引号,如下所示: