find + -delete 是删除符合条件文件的首选,需加 -type f 防误删目录,-delete 必须置于末尾且权限足够,执行前应先用 -ls 或 -print 验证。

用 find + -delete 最安全可靠
直接用 find 配合 -delete 是删除“符合条件文件”的首选,它天然规避了 rm * 的空格、换行、特殊字符等解析风险。
- 必须加
-type f,否则可能误删目录(find默认匹配所有类型) -
-delete只能作用于最后的匹配项,不能写在中间;且要求权限足够(对父目录有写权限) - 执行前先去掉
-delete,换成-ls或-print确认列表,比如:find /tmp -name "*.log" -type f -mtime +30 -ls - 如果路径含空格或中文,
-delete仍能正常工作,比rm $(find ...)更健壮
rm + 通配符只适合简单场景
rm 自带的通配符(*、?、[abc])仅在当前 shell 展开,无法按时间、大小、权限等条件筛选,适用范围有限。
-
rm *.tmp会失败:当没有匹配文件时,bash 默认保留字面量*.tmp,导致报错rm: cannot remove '*.tmp': No such file or directory - 解决办法是启用
nullglob:shopt -s nullglob,这样无匹配时命令不执行 - 但通配符不支持“7天前”“大于10M”这类逻辑,遇到复杂条件必须切回
find - 慎用
rm -f *.log:如果当前目录下恰好有个叫log的目录,*.log不会匹配它;但若误写成rm -f log*,就可能连log_dir/一起删掉
extglob 排除保留文件要先启用
想“删掉除了 a.py 和 b.conf 之外的所有文件”,得靠 bash 的扩展通配符,但默认关闭,必须手动开启。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 运行
shopt -s extglob启用,该设置仅对当前 shell 有效(脚本中需显式写这一行) - 语法是
rm -rf !(a.py|b.conf),注意括号外不能有空格,竖线|是分隔符,不是正则里的“或” - 这个模式只匹配**当前目录下的直接子项**,不递归;也不匹配隐藏文件(
.git、.env等),除非额外开启dotglob - 如果目标文件名含空格,比如
"my config.txt",!(...)无法处理,此时只能用find+-not -name组合
别碰 rm -rf $VAR/* 这种写法
变量未定义或为空时,$VAR/* 会退化成 /*,后果是执行 rm -rf /* —— 即使有 --no-preserve-root 保护,也极可能破坏系统关键路径。
- 永远用引号包裹变量:
rm -rf "$DIR"/*,至少能避免路径含空格时报错 - 更稳妥的做法是先判断:
[ -d "$DIR" ] && rm -rf "$DIR"/* - 如果
$DIR可能为空或为相对路径,建议用cd "$DIR" && rm -rf -- *,配合--明确终止选项解析 - 生产环境批量清理,优先走
find "$DIR" -maxdepth 1 -type f -delete,它不会因变量为空而崩到根目录
实际操作中最容易被忽略的是:条件匹配的边界情况——比如 find -mtime +7 表示“修改时间早于 7×24 小时前”,不是“7 天前”;!(a|b) 不匹配 .a 或 a.bak;rm *.log 在无匹配时不报错但也不做事。这些细节不验证,删错就真的没了。

















