实用的 Linux locate命令示例 – mlocate 和 updatedb

举报
Tiamo_T 发表于 2022/06/09 11:05:51 2022/06/09
【摘要】 当您需要搜索某些文件时,通常可以使用 find 命令。find 是一个很好的搜索工具,但速度很慢。 但是locate可以非常快速地搜索文件。

当您需要搜索某些文件时,通常可以使用 find 命令。find 是一个很好的搜索工具,但速度很慢。

但是locate可以非常快速地搜索文件。

尽管 locate 命令工作得很快,但它仍然没有胜过 find 命令,因为它有一些限制。

本文解释了您需要了解的有关定位命令的所有信息。

定位命令如何工作?– updatedb 和 updatedb.conf

当我们说 locate 搜索非常快时,首先想到的问题是,是什么让 locate 如此之快?

好吧,locate 不搜索磁盘上的文件,而是搜索数据库中的文件路径。

数据库是一个文件,其中包含有关文件及其在系统上的路径的信息。定位数据库文件位于:


/var/lib/mlocate/mlocate.db

下一个合乎逻辑的问题是,是什么让这个 mlocate 数据库保持更新?

好吧,还有另一个称为updatedb的实用程序。当您执行 updatedb 时,它会扫描整个系统并更新 mlocate.db 数据库文件。

因此,'locate' 命令的一个限制是它对数据库的依赖性,该数据库可以由另一个实用程序'updatedb' 更新。因此,为了从“定位”命令获得最新和可靠的结果,应该定期更新其工作的数据库。

我们还可以根据需要配置“updatedb”实用程序。这可以通过更新 updatedb.conf 来实现。这是 updatedb 在更新数据库之前读取的配置文件。updatedb.conf 位于 /etc/ 下:

# cat /etc/updatedb.conf 
PRUNE_BIND_MOUNTS="yes" 
PRUNENAMES=".git .bzr .hg .svn" 
PRUNEPATHS="/tmp /var/spool /media" 
PRUNEFS="NFS nfs nfs4 rpc_pipefs afs binfmt_misc proc smbfs autofs iso9660 ncpfs coda devpts ftpfs devfs mfs shfs sysfs cifs lustre_lite tmpfs usbfs udf fuse.glusterfs fuse.sshfs ecryptfs fusesmb devtmpfs"

updatedb.conf 文件包含 VARIABLES=VALUES 形式的信息。这些变量可以分为:

  • PRUNEFS :文件系统类型的空格分隔列表(在 /etc/mtab 中使用),不应由 updatedb 扫描。文件系统类型匹配不区分大小写。默认情况下,不会跳过任何文件系统类型。当扫描文件系统被跳过时,所有挂载在子树中的文件系统也会被跳过,即使它们的类型与 PRUNEFS 中的任何条目都不匹配。
  • PRUNENAMES :以空格分隔的目录名称列表(无路径),updatedb 不应扫描。默认情况下,不会跳过任何目录名称。请注意,只能指定目录,并且不使用模式机制(例如,通配符)。
  • PRUNEPATHS :以空格分隔的目录路径名列表,updatedb 不应扫描这些路径名。每个路径名必须与locate 报告目录的格式完全一致。默认情况下,不会跳过任何路径。
  • PRUNE_BIND_MOUNTS :字符串 0、no、1 或 yes 之一。如果 PRUNE_BIND_MOUNTS 为 1 或 yes,则 updatedb 不会扫描绑定挂载。所有挂载在绑定挂载的子树中的文件系统也会被跳过,即使它们不是绑定挂载。默认情况下,不会跳过绑定挂载。

请注意,以上所有配置信息也可以通过实用程序“updatedb”的命令行选项进行更改或更新。

定位命令实例

1. 使用 locate 搜索文件

要使用 locate 搜索特定文件,只需执行以下操作

$ 定位 sysctl.conf 
/etc/sysctl.conf 
/usr/share/man/man5/sysctl.conf.5.gz

以下命令在整个系统中搜索 httpd.conf。

$ 定位 httpd.conf 
/etc/httpd/conf/httpd.conf 
/usr/local/apache2/conf/httpd.conf 
/usr/local/apache2/conf/httpd.conf.bak

您还可以使用“locate -0”在一行中显示所有输出。例如:

$ locate -0 httpd.conf

2.只显示计数

要获取匹配条目的数量,请使用 locate -c ,如下所示。

$ locate -c httpd.conf
3

3. 使用 updatedb 刷新 mlocate 数据库

假设您对现有文件进行了备份:

# cd /etc 
# cp sysctl.conf sysctl.conf.orig

如果您尝试使用“locate”实用程序搜索 sysctl.conf,您将找不到 sysctl.conf.orig。

# locate sysctl.conf
/etc/sysctl.conf
/usr/share/man/man5/sysctl.conf.5.gz

原因是在创建 sysctl.conf.orig 之后,locate 实用程序工作的数据库没有更新。因此,让我们使用“updatedb”命令更新数据库并再次执行定位:

$ updatedb
updatedb: can not open a temporary file for `/var/lib/mlocate/mlocate.db'

请注意,update db 需要以 root 身份执行。

# updatedb

在updatedb之后,如果你执行locate,你会找到sysctl.conf.orig文件。

# locate sysctl.conf
/etc/sysctl.conf
/etc/sysctl.conf.orig
/usr/share/man/man5/sysctl.conf.5.gz

4. 更改 mlocate 数据库位置

locate 实用程序读取的默认数据库是 /var/lib/mlocate/mlocate.db,但如果您希望将 locate 命令与保存在其他位置的其他数据库链接,请使用 -d 选项。

例如 :

$ locate -d <new db path> <filename>

请注意,数据库路径也可以从标准输入中获取,如果提到空路径,则选择默认数据库。

5.检查文件是否存在

现在假设我们在上面的示例 3 中创建的文件 sysctl.conf.orig 被删除了,如果您尝试定位 sysctl.conf,它仍然会显示 sysctl.conf.orig 文件。

# cd /etc
# rm sysctl.conf.orig

# locate sysctl.conf
/etc/sysctl.conf
/etc/sysctl.conf.orig
/usr/share/man/man5/sysctl.conf.5.gz

正如您从上面的输出中看到的,即使在文件被删除之后,locate 命令也会显示 sysctl.conf.orig。这个结果是误导性的。

当然你也可以执行updatedb,再尝试locate,会显示正确的结果。

或者,您可以只使用“locate -e”,当您执行定位命令时,它将仅显示系统中存在的文件。即即使该文件存在于mlocate.db 中,它仍然会在显示之前验证以确保该文件实际存在于系统中。

# locate -e sysctl.conf
/etc/sysctl.conf
/usr/share/man/man5/sysctl.conf.5.gz

6.在定位输出中忽略大小写

默认情况下,locate 命令配置为以区分大小写的方式接受文件名。为了使结果不区分大小写,我们可以使用 -i 选项:

在下面的示例中,我们创建了两个小写和大写的文件。

# cd /tmp 
# touch new.txt NEW.txt 

# updatedb

如果你只使用小写的 locate 命令,它只会找到小写的文件。

# locate new.txt
/tmp/new.txt

使用locate -i,它将忽略大小写,并查找小写和大写文件。

$ locate -i new.txt 
/tmp/NEW.txt 
/tmp/new.txt 
/usr/share/doc/samba-common/WHATSNEW.txt.gz

7.限制定位输出

在以下示例中,locate 命令显示了几个条目。

$ locate passwd 
/etc/passwd 
/etc/ 
passwd- /etc/dovecot/conf.d/auth-passwdfile.conf.ext 
/etc/pam.d/passwd 
/etc/security/opasswd 
/etc/vsftpd/passwd 
/lib64 /security/pam_unix_passwd.so 
/usr/bin/ gpasswd /usr 
/bin/htpasswd 
/usr/bin/ldappasswd 
/usr/bin/mksmbpasswd.sh 
/usr/bin/passwd 
..

如果只想显示特定数量的记录,请使用 locate -l 选项并指定要在 locate 命令输出中查看的记录数。

例如,以下仅显示 5 条记录(即使 locate 命令找到多条记录..)

$ locate -l 5 passwd 
/etc/passwd 
/etc/ 
passwd- /etc/dovecot/conf.d/auth-passwdfile.conf.ext 
/etc/pam.d/passwd 
/etc/security/opasswd
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。