linux shell

关注公众号 jb51net

关闭
首页 > 脚本专栏 > linux shell > linux mlocate命令

linux的mlocate命令高级用法详解

作者:WangLanguager

mlocate(modified locate)是Linux下基于预构建数据库进行‌毫秒级文件名/路径搜索‌的工具,本文给大家介绍linux的mlocate命令高级用法,感兴趣的朋友跟随小编一起看看吧

mlocate = Merging Locate(合并定位),是slocate官方改进版,也是当前绝大多数 Linux 发行版的默认 locate 实现。它在保留 slocate 安全特性的基础上,通过增量更新数据库技术大幅提升了更新速度,解决了传统 locate/slocate 全量扫描慢的问题。

⚠️ 重要说明:在 Ubuntu 16.04+、CentOS 7+、Debian 9+、RHEL 7 + 等现代系统中,你执行的locate命令本质上就是 mlocate,它是/usr/bin/locate的软链接。

一、核心特点与工作原理

核心特点

工作原理

mlocate 的核心创新是增量更新机制

  1. 首次运行updatedb时,扫描整个文件系统,生成包含所有文件路径和权限信息的数据库
  2. 同时记录每个目录的最后修改时间
  3. 后续更新时,只扫描修改时间晚于上次更新时间的目录,合并变化到数据库中
  4. 搜索时,mlocate 会先检查用户对文件的访问权限,只返回有权限的结果

数据库默认位置:/var/lib/mlocate/mlocate.db(权限 640,属主 root,组 mlocate,保证安全)

二、基础语法与核心参数

mlocate [选项] 搜索模式

核心必记参数表

表格

短参数长参数含义最常用场景
-i--ignore-case不区分大小写搜索搜索大小写不确定的文件
-c--count只输出匹配结果的数量,不显示具体路径统计符合条件的文件总数
-l N/-n N--limit N只输出前 N 个结果结果过多时避免刷屏
-r--regex使用正则表达式匹配复杂模式搜索
-b--basename只匹配文件名(basename),不匹配完整路径精确查找特定文件名
-e--existing只显示当前实际存在的文件过滤掉数据库中已删除的文件
-w--wholename匹配整个路径(默认行为)搜索包含特定路径的文件
-S--statistics显示数据库的统计信息查看数据库大小、文件总数等
-0--null用 NULL 字符分隔结果配合xargs -0处理含空格的文件名
-d 路径--database 路径使用指定的数据库文件测试自定义数据库

辅助参数

表格

参数含义
-q安静模式,不显示错误信息
-v显示详细的搜索过程
-V显示版本信息
-h显示帮助信息

三、高频实战示例(最常用场景)

1. 基本文件搜索

# 搜索所有包含"test"的文件和目录
mlocate test
# 搜索所有.txt文件
mlocate .txt

2. 不区分大小写搜索

# 同时匹配Test.TXT、TEST.txt、test.TXT等
mlocate -i test.txt

3. 统计匹配结果数量

# 统计系统中所有.log文件的数量
mlocate -c .log

4. 限制结果数量

# 只显示前20个.png图片
mlocate -l 20 .png

5. 只匹配文件名(精确查找)

# 只查找文件名是"passwd"的文件,不匹配包含passwd的路径
# 不加-b会匹配/etc/passwd、/usr/bin/passwd、/var/log/passwd.log等
mlocate -b passwd

6. 只显示当前存在的文件

# 过滤掉数据库中已删除的文件,结果更准确
mlocate -e deleted_file

7. 正则表达式搜索

# 搜索所有以.sh结尾的脚本文件
mlocate -r "\.sh$"
# 搜索所有在/etc目录下的.conf文件
mlocate -r "^/etc/.*\.conf$"
# 搜索所有文件名包含"error"且在/var/log目录下的文件
mlocate -r "^/var/log/.*error.*"

8. 查看数据库统计信息

mlocate -S
# 输出示例:
# Database /var/lib/mlocate/mlocate.db:
#         2,345,678 files
#         156,789 directories
#         67.8 MB database size
#         Last database update: Sat Jun  6 10:00:00 2026

9. 处理含空格的文件名

# 安全地删除所有找到的.tmp文件(即使文件名含空格)
mlocate -0 *.tmp | xargs -0 rm -f

四、数据库管理:updatedb 命令

mlocate的准确性和性能完全依赖于数据库的新鲜度,updatedb是 mlocate 配套的数据库更新工具(实际上是 mlocate 的软链接)。

1. 手动更新数据库

# 立即更新整个系统的数据库(需要root权限)
sudo updatedb

⚠️ 新创建 / 删除的文件默认要等到第二天才能被找到,手动执行sudo updatedb可以立即生效。由于 mlocate 采用增量更新,这个过程通常只需要几秒钟。

2. 数据库配置文件

updatedb的行为由/etc/updatedb.conf配置文件控制,这是解决 "mlocate 找不到文件" 问题的核心

核心配置项详解

表格

配置项含义默认值示例
PRUNEFS排除的文件系统类型tmpfs sysfs proc devtmpfs nfs cifs
PRUNEPATHS排除的目录路径/tmp /proc /sys /mnt /media /var/tmp /var/cache
PRUNENAMES排除的文件名 / 目录名.git .svn .hg .cache .npm .m2
BIND_MOUNTS是否索引绑定挂载点yes
PRUNE_BIND_MOUNTS是否排除绑定挂载点yes

常见配置修改示例

示例 1:添加自定义目录到索引 如果希望 mlocate 能搜索到/data目录下的文件,需要从PRUNEPATHS中移除/data

# 编辑配置文件
sudo nano /etc/updatedb.conf
# 修改前:PRUNEPATHS="/tmp /proc /sys /mnt /media /data"
# 修改后:PRUNEPATHS="/tmp /proc /sys /mnt /media"
# 保存后更新数据库
sudo updatedb

示例 2:排除特定目录 如果不希望 mlocate 索引/home/user/Downloads目录,添加到PRUNEPATHS

PRUNEPATHS="/tmp /proc /sys /mnt /media /home/user/Downloads"

3. 定时任务

mlocate 的数据库默认每天更新一次,定时任务位于:

五、mlocate 与其他 locate 实现全面对比

表格

特性传统 locateslocatemlocateplocate
发布时间1980 年代1990 年代2000 年代2020 年代
安全特性❌ 无权限检查✅ 有权限检查✅ 有权限检查✅ 有权限检查
更新方式全量扫描全量扫描增量扫描增量扫描 + io_uring
更新速度极慢极快
搜索速度极快(比 mlocate 快 10-100 倍)
数据库大小小(压缩率更高)
当前状态已淘汰已淘汰主流新兴主流
默认发行版老旧系统RHEL 4/5Ubuntu 16.04+/CentOS 7+Debian 12+/Ubuntu 24.04+
数据库位置/var/lib/locate/locate.db/var/lib/slocate/slocate.db/var/lib/mlocate/mlocate.db/var/lib/plocate/plocate.db

六、避坑重点与最佳实践

避坑重点

最佳实践

  1. 日常快速查找用 mlocate,复杂需求用 find
  2. 找不到文件时先执行sudo updatedb
  3. 重要搜索加-e参数确保文件存在
  4. 精确查找文件名加-b参数
  5. 结果过多时用-l参数限制数量
  6. 定期清理数据库: 如果数据库过大或损坏,可以删除后重新生成:
sudo rm /var/lib/mlocate/mlocate.db
sudo updatedb

七、安装与验证

1. 安装 mlocate

大多数系统默认已安装,如果没有可以手动安装:

# Ubuntu/Debian
sudo apt install mlocate
# CentOS/RHEL
sudo yum install mlocate
# 首次使用前必须初始化数据库
sudo updatedb

2. 验证当前系统使用的是 mlocate

# 方法1:查看软链接
ls -l /usr/bin/locate
# 输出:lrwxrwxrwx 1 root root 24 May 15 10:00 /usr/bin/locate -> /etc/alternatives/locate
ls -l /etc/alternatives/locate
# 输出:lrwxrwxrwx 1 root root 22 May 15 10:00 /etc/alternatives/locate -> /usr/bin/mlocate
# 方法2:查看版本信息
locate --version
# 输出:mlocate 0.26

八、高级用法

1. 创建自定义数据库

# 只索引/home/user目录,生成自定义数据库
sudo updatedb --localpaths="/home/user" --output ~/mydb.db
# 使用自定义数据库搜索
mlocate --database ~/mydb.db test.txt

2. 只更新特定目录的数据库

# 只更新/data目录的索引
sudo updatedb --localpaths="/data"

3. 查找所有用户都能访问的文件

# 查找所有权限为755的文件(需要root权限)
sudo mlocate -r ".*" | xargs ls -l | grep "^-rwxr-xr-x"

4. 结合其他命令使用

# 查找所有.log文件并搜索其中的"error"关键词
mlocate *.log | xargs grep "error"
# 查找所有.mp3文件并添加到播放列表
mlocate -b .mp3 > playlist.m3u
# 查找所有大于1G的文件(需要配合find)
mlocate -r ".*" | xargs find {} -size +1G 2>/dev/null

到此这篇关于linux的mlocate命令高级用法详解的文章就介绍到这了,更多相关linux mlocate命令内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文