find 是 Linux 下功能最强大的文件搜索工具,它不依赖预建索引,而是在指定目录中实时遍历,根据文件的各种属性进行精确匹配。掌握 find,意味着你可以随时找出符合任意条件的文件,无论是按名称、类型、大小、时间还是权限,都能应对自如。
基本语法
find [起始目录] [匹配条件] [动作]
- 起始目录:从哪里开始搜索,默认是当前目录。
- 匹配条件:各种测试选项,可以组合。
- 动作:对匹配到的文件做什么(默认是
-print打印路径)。
下面按常用维度逐一分解。
1. 按名称查找
-name "模式":区分大小写匹配文件名。-iname "模式":不区分大小写。- 模式中可使用通配符:
*匹配任意字符,?匹配单个字符。
find /var/log -name "*.log" # 查找所有 .log 文件
find /etc -iname "*readme*" # 查找文件名包含 readme(忽略大小写)的文件
find /home -name "*.jpg" -o -name "*.png" # 查找 .jpg 或 .png 文件
2. 按类型查找
使用 -type 指定文件类型:
f:普通文件d:目录l:符号链接b:块设备c:字符设备
find . -type d -name "config" # 查找当前目录下所有名为 config 的目录
find /dev -type b # 查找所有块设备文件
find . -type l # 查找所有符号链接
3. 按大小查找
-size +n[c]:大于 n 块(默认块为 512 字节)或 n 字节/千字节/兆字节。-size -n[c]:小于。- 单位后缀:
c(字节)、k(KB)、M(MB)、G(GB)。
find / -size +100M # 查找大于 100MB 的文件
find . -size -10k # 查找小于 10KB 的文件
find /tmp -size +1M -size -5M # 查找 1MB 到 5MB 之间的文件
4. 按时间查找
分为访问时间(atime)、修改时间(mtime)、状态改变时间(ctime),单位是天。也有以分钟为单位的 amin、mmin、cmin。
-mtime n:恰好 n 天前被修改过的文件。-mtime +n:修改时间在 n 天之前(大于 n 天)。-mtime -n:修改时间在最近 n 天之内(小于 n 天)。
find /var/log -mtime -7 # 最近 7 天内修改过的文件
find . -mmin -30 # 最近 30 分钟内修改过的文件
find /etc -atime +30 # 超过 30 天未被访问的文件
5. 按权限查找
-perm 模式:精确匹配权限(八进制数字或符号)。-perm -模式:包含指定的权限位。-perm /模式:任一位匹配即可。
find . -perm 644 # 权限恰好为 644 的文件
find /usr/bin -perm -u+s # 查找设置了 SUID 位的文件
find / -perm /o+w # 查找其他用户可写的文件(任一此类文件)
find . -type f -perm 777 # 查找权限为 777 的普通文件
6. 组合条件与动作
- 用
-o(或)连接多个条件。 - 用
-not或!取反(在 shell 中需转义或引号)。 -exec或-execdir对找到的文件执行命令,非常强大。
# 查找不属于当前用户的文件
find /data -type f -not -user $USER
# 查找所有 .tmp 文件并删除(谨慎使用)
find . -name "*.tmp" -exec rm {} \;
# 查找所有空文件,并列出详细属性
find . -type f -empty -exec ls -l {} \;
# 查找比某个参考文件更新的文件
find . -type f -newer /etc/passwd
实用技巧
- 如果目录很深,文件极多,可适当限制搜索深度:
-maxdepth、-mindepth。 - 写脚本时,优先使用
-print0与xargs -0配合处理带空格的文件名:
find /path -name "*.log" -print0 | xargs -0 rm
- 查找后批量处理文件改名、压缩、移动等,
-exec是最直接的方式。
掌握 find 就拥有了在文件系统中“指哪打哪”的能力,无论是日常清理、安全审计还是脚本自动化,它都是无可替代的瑞士军刀。