mlocate: 查找文件

发布时间: 更新时间: 总字数:1258 阅读时间:3m 作者: IP上海 分享 网址

mlocate(Merging Locate)是 Linux 系统中用于快速查找文件的一个命令行工具。它是传统的 locate 命令的一种实现版本,设计目的是为了比旧版的 locate 更安全、更新速度更快。

介绍

  • mlocate 是一个典型的空间换时间的工具,通过后台维护一个数据库来实现文件的瞬间搜索。它是 Linux 系统管理员日常最常用的高频工具之一。
  • mlocate 是一个基于命令行的文件查找工具,比 find 命令更快、更精确,并且支持正则表达式搜索
    • 预扫描文件到 db

核心功能与原理

  • 极速查找:当使用 locate 命令查找文件时,它不会find 命令那样去遍历整个硬盘(那样很慢)。相反,它去查询一个预先构建好的数据库文件(通常位于 /var/lib/mlocate/mlocate.db)。因此,无论硬盘上有多少文件,查找结果几乎都是毫秒级的。
  • 数据库索引:为了保证查询结果准确,系统需要定期扫描硬盘并更新这个数据库。这个工作由 updatedb 命令完成(通常通过每日的定时任务自动运行)。

mlocate 的特点(为什么要用它?)

它的全称是 Merging Locate,相比于旧版的 GNU locate,它有以下改进:

  1. 权限安全(主要特点)
    • mlocate 在搜索时会检查当前用户是否有权限访问该文件所在的目录
    • 如果没有权限进入某个目录,mlocate 就不会在结果中向显示那个文件。这避免了普通用户通过 locate 探测到系统敏感文件的存在。
  2. 增量更新(Merging)
    • 它的名字 “Merging” 来源于此。在运行 updatedb 更新数据库时,它会将现有的数据库与文件系统现状进行合并。它可以利用旧数据库中的信息来跳过未发生变化的目录,从而加快索引更新的速度,减少硬盘 I/O 压力。

mlocate vs. find

这是新手最容易混淆的两个命令:

特性 mlocate (locate) find
速度 极快 (查数据库) (实时扫描硬盘)
实时性 非实时 (新建的文件可能查不到,直到下次更新数据库) 实时 (能查到刚创建的文件)
CPU/硬盘消耗 查找时几乎为 0,但每日更新数据库时会占用资源 查找时占用较高资源
语法 简单 (locate filename) 复杂 (find / -name filename)
适用场景 模糊记得文件名,想快速找到位置 脚本处理、查找特定时间/大小/权限的文件

常见用法

  1. 查找文件
locate nginx.conf
# 查找名字里包含 "nginx.conf" 的所有文件
  1. 忽略大小写
locate -i readme.md
  1. 使用正则表达式
locate -r '\.jpg$'
# 查找以 .jpg 结尾的文件
  1. 限制显示数量
locate -n 10 python
# 只显示前10个结果
  1. 立即手动更新数据库 如果你刚下载了一个文件,用 locate 找不到,需要手动强制更新索引:
sudo updatedb

现状与替代品 (plocate)

虽然 mlocate 曾经是主流发行版的默认选择,但现在越来越多的新发行版(如 Fedora 34+、Ubuntu 21.04+、Debian 11+)开始使用 plocate 来替代它。

  • plocate 是 mlocate 的继任者。
  • 它使用更高效的压缩算法和索引结构。
  • 速度更快updatedb 的速度比 mlocate 快很多倍,生成的数据库也更小。

F&Q

mlocate db 占用很多空间问题

  • 当系统文件很多时,/var/lib/mlocate/ 会占用很多空间
  • 解决方式

停止服务

sudo killall updatedb.mlocate

# 或
sudo kill -9 <PID>

停止每天自动更新 db

sudo chmod -x /etc/cron.daily/mlocate

# 或直接卸载
apt remove locate mlocate
yum remove mlocate

释放空间

rm -rf /var/lib/mlocate/*

可以通过配置文件 /etc/updatedb.conf 减少采集的文件数量

PRUNE_BIND_MOUNTS = "yes"  # 是否限制
PRUNEFS = "9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset debugfs devpts ecryptfs exofs fuse fuse.sshfs fusectl gfs gfs2 gpfs hugetlbfs inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfs nfs4 nfsd pipefs proc ramfs rootfs rpc_pipefs securityfs selinuxfs sfs sockfs sysfs tmpfs ubifs udf usbfs"  # 排除的文件系统类型
PRUNENAMES = ".git .hg .svn"  # 排除的文件夹
PRUNEPATHS = "/afs /media /mnt /net /sfs /tmp /udev /var/cache/ccache /var/lib/yum/yumdb /var/spool/cups /var/spool/squid /var/tmp /freeoa"  # 排除的路径
本文总阅读量 次 本站总访问量 次 本站总访客数
Home Archives Categories Tags Statistics