讲解
find 按条件在目录树里递归查找文件,基本结构是 find 起始路径 条件 动作。最常用的条件:-name "模式" 按文件名匹配(区分大小写,模式里 * 匹配任意字符),-iname 是不区分大小写版本;-type f 只找文件、-type d 只找目录;-mtime -7 找 7 天内修改过的(+7 是 7 天前);-size +100M 找大于 100MB 的。多个条件写在一起是「与」的关系,用 -o 表达「或」。
find 找到之后默认动作是打印路径,加 -exec 可以对每个结果执行命令:find . -name "*.log" -exec rm {} ; 中 {} 会被替换成找到的路径,; 是命令结束标记。把 ; 换成 + 会把多个路径合并成一批传给命令,效率高很多。还有一个更安全的选项 -delete 直接删除找到的文件——同样建议先不带 -delete 跑一遍确认范围。
平台差异提醒:Linux 的 GNU find 支持 -printf 自定义输出格式、-maxdepth 限制深度等选项;macOS 的 BSD find 没有 -printf,但 -maxdepth 两边都有。写跨平台脚本时尽量只用 POSIX 规定的选项。
示例
# 按名字找(模式要用引号,防止 shell 提前展开 *)
find . -name "*.txt"
# 只找目录 / 只找文件
find . -type d
find docs -type f
# 不区分大小写
find . -iname "*.TXT"
# 找空文件
find . -type f -empty
# 对找到的每个文件执行 wc -l(+ 表示批量传入,效率高)
find . -name "*.txt" -exec wc -l {} +
常见坑
- 模式没加引号:find . -name .txt 里的 * 会被 shell 先在当前目录展开,结果匪夷所思。永远写 -name ".txt"。
- 忘记 find 默认递归:find . 会钻进所有子目录,大目录树上很慢。只想看当前层用 -maxdepth 1。
- -mtime 的单位是天:找最近一小时的文件要用 -mmin -60(分钟),macOS 同样支持 -mmin。
- -exec 忘了结尾:-exec 命令必须以 ; 或 + 结尾,漏了就报错。顺手记一对搭档:{} 占位、; 收尾。
小结
find 路径 条件 动作,按名 -name、按类型 -type、按时间 -mtime、按大小 -size,找到后用 -exec 批量处理。下一节把搜索的范围从文件名深入到文件内容:grep。