find删除文件需用-exec rm {} \;语法,{}为占位符,\;为结束符,删除前应先-print验证;可改用+、-delete或xargs提升效率与安全性,注意路径、引号、类型限定等避坑要点。

直接用 find 配 -exec 删除文件,核心是让每个匹配结果都作为参数传给 rm,但必须写对语法、注意安全边界,否则容易误删或报错。
基本写法和关键符号
find 后接路径和条件,再跟 -exec 命令 {} \;。其中:
-
{}是占位符,代表当前找到的每一个文件或目录路径 -
\;是必需的结束符(反斜杠转义分号),不能写成;或;; -
{}前后建议加空格,避免与命令粘连;路径含空格时推荐写成"{}" - 删除前务必先用
-print或-ls看一遍结果,比如:find /tmp -name "*.log" -print
常用删除场景示例
按不同需求组合条件,再加 -exec rm:
- 删指定名称的文件:
find /var/log -name "old*.log" -type f -exec rm {} \; - 删空目录:
find /data -type d -empty -exec rmdir {} \;(rmdir只删空目录) - 删非空目录及其内容:
find /tmp -type d -name "cache_*" -exec rm -rf {} \; - 删 7 天前修改的普通文件:
find /home -type f -mtime +7 -exec rm {} \; - 确认式删除(每删一个都问你):
find . -name "*.tmp" -ok rm {} \;
更高效或更安全的替代方式
-exec 是逐个执行,适合小批量或需精确控制的场景;但大批量时有更好选择:
- 用
+代替\;:把多个文件一次传给rm,减少进程调用次数find /tmp -name "*.log" -exec rm {} + - 用
-delete:简洁高效,但只支持简单条件,且不兼容老旧系统find /tmp -type f -name "*.swp" -delete - 用
xargs:自动分批处理,不怕参数超长,适合海量文件find /mnt/data -name "*.bak" | xargs rm
若文件名含空格或换行,加-0和-print0配合:find /mnt/data -name "*.bak" -print0 | xargs -0 rm
容易出错的地方
几个高频坑点,操作前多看一眼:
-
rm -rf没加-type d就去删目录名匹配项?可能误删同名文件 - 路径写错(比如漏掉
/或写成./),导致删了不该删的层级 - 通配符没加引号:
-name *.log会被 shell 展开,应写成-name "*.log" - 权限不足时
-exec会跳过部分文件,但不会报错,需检查实际删了多少 - 删除目录时混用
rmdir和rm -rf:非空目录用rmdir会失败,别硬扛

















