实用的 Linux locate命令示例 – mlocate 和 updatedb
当您需要搜索某些文件时,通常可以使用 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
- 点赞
- 收藏
- 关注作者
评论(0)