执行动作是什么
find 可以边查边干:-exec 对每个匹配结果执行一条外部命令,-delete 直接删除,-ok 则在执行前逐个询问。语法上最容易混淆的是结尾符——反斜杠加分号表示每个文件执行一次,加号表示把多个文件攒成一批一次执行,后者的进程开销小得多。
基本信息
| 适用平台 | Linux、Unix 通用;-delete 与空字符分隔输出属于常见扩展 |
|---|---|
| 命令语法 | find ... -exec 命令 花括号 结尾符 |
| 结尾符 | 反斜杠加分号逐个执行;加号批量执行 |
| 占位符 | 一对花括号代表当前匹配到的文件路径 |
典型使用场景
- 批量压缩历史文件
- 批量修改权限或属主
- 删除临时文件与中间产物
- 对匹配结果执行自定义校验脚本
- 危险操作前用交互确认模式逐步放行
常用示例
常用示例
find /old -name '*.log' -exec gzip -9 {} \;
find /old -name '*.log' -exec gzip -9 {} +
find /srv -name '*.bak' -delete
find . -name '*.tmp' -print0 | xargs -0 rm -v
find /data -type f -name '*.csv' -exec sh -c 'wc -l "$1"' _ {} \; | head写法对比
| 写法 | 行为 | 适用 |
|---|---|---|
| 逐个执行形式 | 每个文件调用一次命令 | 命令不支持同时接收多个参数 |
| 批量执行形式 | 攒够一批后一次调用 | 大多数场景,效率更高 |
| -delete | 直接删除 | 确认无误后使用 |
| 交互确认形式 | 执行前逐个询问 | 危险操作的最后一道闸 |
| 空字符分隔输出配 xargs | 用空字符传递文件名 | 文件名可能含空格时 |
批量执行形式里,代表文件的占位符必须放在命令的最后一个参数位置,插在中间会直接报语法错误。
在 -exec 里要用管道、重定向或变量时,必须包一层 shell,同时注意位置参数的写法;这也是这类命令最容易写错、后果又最重的地方。
交互确认模式在文件很多时要点很久,更实用的做法是先跑一遍只打印的方式,核对数量与范围无误后再统一下手。
交互与免交互写法
| 写法 | 行为 | 适用 |
|---|---|---|
| -exec 命令 \; | 逐个文件执行 | 命令不支持多参数 |
| -exec 命令 + | 批量一次性传入 | 绝大多数场景,效率更高 |
| -ok 命令 \; | 逐个询问后执行 | 人工放行危险动作 |
| -delete | 不调用外部命令直接删 | 清单核对无误后 |
| -print0 配 xargs -0 | 交给外部命令批处理 | 需要并行或复杂编排时 |
批量执行形式并不保证只调用一次:匹配到的文件数量超过系统命令行长度上限时,find 会自动分成多批分别执行,所以命令不能假设「一次拿到全部文件」。需要汇总结果时,让命令把输出追加到同一个文件,而不是在内存里累加。