-xdev(或-mount)用于限制find仅在指定路径所在文件系统内搜索,避免遍历/proc、/mnt等挂载点引发性能下降或意外结果;必须紧接路径后、其他表达式前使用。

使用 -xdev(或等价的 -mount)选项可让 find 不跨越文件系统边界,避免因遍历其他挂载点(如 /proc、/sys、/mnt、/media 或网络文件系统)引发大量无谓 I/O 和搜索延迟。
为什么需要 -xdev?
默认情况下,find /path -name "*.log" 会递归进入所有子目录——包括那些挂载在 /path 下的独立文件系统(比如 /home 单独分区、/mnt/usb 插入的 U 盘、/proc 虚拟文件系统)。这些挂载点可能:
• 包含海量伪文件(如 /proc 下每个进程一个目录),触发大量内核态路径解析;
• 指向慢速设备(USB、NFS、CIFS),显著拖慢搜索;
• 返回意外结果(例如匹配到远程磁盘上的日志,而非本机目标分区)。
正确用法:-xdev 必须紧跟路径参数之后
-xdev 是 find 的“测试条件”(test),不是全局开关。它只对它前面指定的起始路径生效,且必须出现在路径之后、其他表达式之前:
✓ 正确写法:find /var -xdev -name "*.tmp" ← 仅搜索 /var 所在文件系统find /home/user -xdev -type f -size +10M ← 限制在 user 目录所在分区
✗ 错误写法:find -xdev /var -name "*.tmp" ← 位置错,find 会报错或行为异常find /var -name "*.tmp" -xdev ← -xdev 在最后,实际无效(部分旧版本甚至忽略)
替代写法与兼容性注意
• -xdev 是 POSIX 标准选项,所有主流 Linux 发行版均支持;
• GNU findutils 还提供等价的 -mount(语义完全相同,可读性略强);
• 某些极老系统(如部分 BSD 变种)可能只认 -xdev,建议优先使用;
• 若需脚本兼容性,可加判断:find --version 2>/dev/null | grep -q GNU && MOUNT_OPT="-mount" || MOUNT_OPT="-xdev"。
配合 -prune 实现更精细控制(进阶)
当需跳过特定挂载点但保留其他跨文件系统能力时(少见),可用 -prune。例如跳过 /mnt 但不跳过 /home(即使它们是不同文件系统):
find / -path '/mnt' -prune -o -name "config.ini" -print
但注意:这仍会访问 /mnt 的 inode(触发一次 stat),而 -xdev 从源头阻止进入——更轻量、更安全。











