
find 命令详解find用于在目录树中实时递归查找文件并按条件执行动作。Linux 下通常是 GNU findutilsmacOS/BSD 的find语法略有差异。1. 基本语法find [起始路径...] [表达式]起始路径可写多个省略时默认.表达式由测试、动作、运算符组成如果表达式里没有动作默认执行-print示例find . # 列出当前目录下所有文件/目录 find /var/log -type f # 只找普通文件 find . -name *.txt # 找 .txt 文件 find /etc/systemd -mindepth 3 -maxdepth 3 -path /etc/systemd/*/*.wants/kysdk-conf2.service2. 全局选项find /path -maxdepth 2 -type f常用选项说明-maxdepth N最大递归深度-mindepth N最小递归深度-depth先处理目录内容再处理目录本身-xdev/-mount不跨越文件系统-P默认不跟随符号链接-L跟随符号链接-H只跟随命令行参数中的符号链接注意-maxdepth、-mindepth这类全局选项建议放在起始路径后、其他测试前。3. 表达式逻辑优先级从高到低( )分组!或-not取反-a或-and与默认关系-o或-or或示例find . -type f \( -name *.c -o -name *.h \) -print find . -type f ! -name *.txt find . -type f -name *.log -o -name *.tmp括号需要转义\(\)避免被 shell 解释。4. 常用测试条件4.1 按名称/路径find . -name *.log # 区分大小写匹配文件名 find . -iname *.jpg # 忽略大小写 find . -path */log/*.log # 匹配完整路径 find . -ipath */log/*.log # 忽略大小写 find . -regex .*\.(jpg|png)$-name只匹配文件名部分-path匹配完整路径-regex默认是 Emacs 正则可用-regextype posix-extended改4.2 按类型find . -type f # 普通文件 find . -type d # 目录 find . -type l # 符号链接常见类型类型含义f普通文件d目录l符号链接b块设备c字符设备pFIFOssocket4.3 按大小find . -type f -size 100M # 大于 100 MiB find . -type f -size -1k # 小于 1 KiB find . -type f -empty # 空文件或空目录单位c字节kKiBMMiBGGiB默认单位是 512 字节块表示大于-表示小于不写表示等于。4.4 按时间find . -type f -mmin -30 # 30 分钟内修改过 find . -type f -mtime -7 # 最近 7 天内修改过 find . -type f -mtime 7 # 超过 7 天未修改通常为 8 天前及更早 find . -type f -newer /tmp/ref # 比 /tmp/ref 新 find . -newermt 2024-01-01 ! -newermt 2024-02-01常见时间选项含义-atime访问时间-mtime修改时间-ctimeinode 状态改变时间不是创建时间-amin/-mmin/-cmin按分钟-newer比指定文件新-newermt比指定时间新4.5 按权限find . -type f -perm 644 # 权限精确为 644 find . -type f -perm -uw # 用户写权限被设置其他位不限 find . -type f -perm /ow # 其他人写权限任意匹配 find . -type f -perm /222 # 任意写位被设置含义-perm mode精确匹配-perm -mode所有列出的权限位都必须设置-perm /mode任意列出的权限位设置即可4.6 按用户/组find /home -user alice find /home -group dev find / -nouser find / -nogroup4.7 其他常用测试find . -inum 12345 # 按 inode find . -links 2 # 硬链接数为 2 find . -samefile /path/file # 同一 inode find . -readable # 当前用户可读 find . -writable # 当前用户可写 find . -executable # 当前用户可执行5. 常用动作5.1 打印find . -print find . -print0 find . -ls-print0用 NUL 分隔适合配合xargs -0处理特殊文件名。5.2 格式化输出find . -type f -printf %TY-%Tm-%Td %TH:%TM %10s %p\n常用格式格式含义%p完整路径%f文件名%h所在目录%s大小%m八进制权限%M符号权限%u用户%g组%y类型%TY-%Tm-%Td修改日期%TH:%TM修改时间5.3 执行命令每个文件执行一次find . -type f -name *.log -exec rm -f {} \;批量执行更高效find . -type f -name *.log -exec rm -f {} 交互确认find . -type f -name *.tmp -ok rm -f {} \;在文件所在目录执行find . -type f -name *.tmp -execdir rm -f {} 5.4 删除find /tmp -type f -mtime 7 -delete注意-delete会自动启用-depth。使用前建议先-print确认find /tmp -type f -mtime 7 -print find /tmp -type f -mtime 7 -delete5.5 排除目录find . \( -path ./.git -o -path ./node_modules \) -prune -o -type f -print含义遇到.git或node_modules不进入其他普通文件打印。5.6 找到后退出find . -type f -name target.conf -print -quit6. 典型示例# 查找当前目录下所有 .log 文件 find . -type f -name *.log # 查找大于 1G 的文件 find / -xdev -type f -size 1G -printf %s %p\n | sort -nr | head # 查找最近 30 分钟修改过的文件 find . -type f -mmin -30 # 查找权限为 777 的文件 find . -type f -perm 777 # 查找并批量 grep find . -type f -name *.c -exec grep -l main {} # 删除 7 天前的日志 find /var/log -type f -name *.log -mtime 7 -delete # 配合 xargs 处理特殊文件名 find . -type f -name *.txt -print0 | xargs -0 rm -f # 查找空目录并删除 find . -type d -empty -delete7. 注意事项引号很重要find . -name *.txt要加引号否则*可能被 shell 提前展开。-name和-path不同-name只匹配文件名-path匹配完整路径。-mtime 7不是精确第 7 天它表示超过 7×24 小时按整天取整后通常匹配 8 天前及更早。-exec ... 比-exec ... \;高效前者会批量传参减少进程创建次数。删除操作先打印先运行-print确认结果再换成-delete或-exec rm。符号链接默认不跟随默认-P不跟随符号链接需要跟随时用-L但可能遇到循环。文件名含空格/换行用-print0配合xargs -0不要直接用-print | xargs。性能优化尽量缩小起始路径使用-maxdepth、-type f、-xdev避免从/全盘扫描。8. 速查find 起点 [选项] [测试] [动作] find . -type f -name *.txt find . -type d -name build find . -size 100M find . -mtime 7 find . -perm /ow find . -user alice find . -empty find . -name .git -prune -o -print find . -type f -exec rm {} \; find . -type f -exec rm {} find . -type f -print0 | xargs -0 rm -f find . -type f -printf %p %s\n一句话find的核心是从起点递归遍历用表达式组合测试条件再对匹配文件执行动作。