首页/系统/Linux 运维命令速查/find 执行动作(-exec / -delete)
文件与目录76 条

find 执行动作(-exec / -delete)

边查边干:-exec 调外部命令(\; 单文件一次,+ 批量一次),-delete 直接删除,-ok 交互确认。

Linux 运维命令速查系统更新于 2026-10-13

执行动作是什么

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 会自动分成多批分别执行,所以命令不能假设「一次拿到全部文件」。需要汇总结果时,让命令把输出追加到同一个文件,而不是在内存里累加。

易错点

  • 批量执行形式里占位符位置写错,命令无法执行
  • 删除动作没有确认环节,动手前先用打印模式核对匹配集合
  • 逐个执行形式在文件很多时进程开销大,能批量就批量
  • 文件名含空格或换行时不做空字符分隔处理,参数会被拆错
  • 在 -exec 里直接写管道而不包 shell,会被当成普通参数传入
  • 把 -ok 写进无人值守脚本:它需要终端应答,在 cron 与流水线里只会一直等待或被当成拒绝,危险动作的人工确认应在执行前完成

数据来源与参考

  • man 1 find(GNU findutils 手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌