rm 命令详解
更新时间:2026-08-29。本文是「一个命令一个文档」系列,属于文件与目录操作命令族。
rm是 Linux 里最需要敬畏的命令——它不进回收站、不可恢复。
为什么单独写 rm?因为"误删生产数据"是运维最常见的惨剧之一,而绝大多数惨剧本可以用 -i/-I/回收站方案避免。rm -rf / 的传说谁都听过,但真正坑人的是那些看似无害的 rm -rf $DIR/ 里 DIR 变量为空的情况。
rm(remove,移除)永久删除文件或目录。在 ext4/xfs 上,删除后数据块立即标记空闲,没有 undo、没有回收站(除非你特意配了)。
一、最基本的用法
rm file.txt # 删除一个文件
rm a.txt b.txt # 删多个
rm -r mydir/ # 递归删除目录(必加 -r,否则报 is a directory)致命默认:
rm不询问、不备份、不可恢复。删错只能从备份或文件系统快照救。这是它和 Windows 回收站最大的区别,也是敬畏它的理由。
二、高频选项一张表
| 选项 | 作用 | 示例 |
|---|---|---|
-r / -R | 递归删除目录及其内容(删目录必加) | rm -r build/ |
-f | 强制:忽略不存在的文件、不提示(force) | rm -f *.tmp |
-i | 每删一个都交互确认 | rm -i *.log |
-I | 删超过 3 个文件或递归时一次性确认 | rm -I *.log(比 -i 省事) |
-v | 显示删了什么(verbose) | rm -rv olddir/ |
--preserve-root | 保护 / 不被删(现代 rm 默认开) | rm -rf / 直接拒绝 |
--one-file-system | 不跨文件系统删 | 配合 -r 防误删挂载点 |
-i和-f冲突时-f优先(-f会压掉-i的提示)。所以rm -rf组合是"强制+递归+无提示"——最危险的组合,也是删库标配。
三、实战 demo
demo 1:安全删除——把默认改成询问
# 在 ~/.bashrc 里加:
alias rm='rm -I' # 删多个或递归时一次性确认,日常够用又不烦
alias rm='rm -i' # 更严格:每个都问(适合新手)
source ~/.bashrc
rm *.log # 现在会问 "remove all arguments? "这是最重要的防护:给 rm 加别名确认,能挡掉绝大多数手滑。
demo 2:清理构建产物(目录递归删)
rm -rf dist/ node_modules/.cache/
# 构建脚本里常见;但注意变量为空的风险(见第五节)demo 3:只删文件不碰目录
rm -i *.tmp # 通配符只匹配文件,目录会被跳过并报错(除非 -r)
find . -maxdepth 1 -type f -name '*.tmp' -delete # 更精确:只删当前层文件demo 4:显示删了哪些(大批量清理时心里有底)
rm -rv /tmp/old_sessions/ # -v 逐个打印,避免"静默删了一堆不知道"demo 5:用回收站替代真删除(强烈推荐)
# 装 trash-cli,把删除变成进回收站
trash-put file.txt # 进回收站,可恢复
trash-list # 看回收站
trash-restore # 恢复
# 然后 alias rm='trash-put' 彻底告别误删四、rm -rf 的毁灭性与防护
rm -rf = 递归 + 强制 + 无提示,所到之处片甲不留。两个真实高危场景:
- 变量为空:
rm -rf "$DIR/"若DIR没赋值,变成rm -rf /—— 删根(现代 rm 有--preserve-root默认挡住/,但rm -rf /home/$USER/*若 USER 空就变rm -rf /home/*,照删不误)。 - 空格陷阱:
rm -rf /tmp/old files/若引号没包好,变成删/tmp/old和files/。
防护手段(按重要度):
- 别名确认:
alias rm='rm -I',最省事的底线。 - 回收站:
alias rm='trash-put',真误删可恢复。 - 先 ls 再 rm:删前先 ls 看看匹配到什么,确认无误再替换成 rm。
--preserve-root:别关掉它(默认开)。
# 安全范式:先看后删
ls -d /path/to/cleanup/* # 确认匹配范围
rm -I /path/to/cleanup/* # 再删五、和 shred / find 的配合
- 彻底擦除(防恢复):普通
rm只是释放块,数据可被恢复;shred -u file多次覆写后再删,适合敏感文件,见 shred。 - 按条件删:find 的
-delete比find ... -exec rm安全(先确认匹配),见 find:bashfind /tmp -type f -mtime +7 -delete # 删 7 天前的临时文件
六、常见坑
- 删目录忘
-r→rm: cannot remove 'dir': Is a directory。 rm -f不会因"文件不存在"报错(脚本里常用,但也可能悄悄吞掉你以为存在其实路径写错的文件)。- 通配符
rm *在空目录报错 "cannot remove, No such file",脚本里先shopt -s nullglob避免。 - 删正在运行的程序打开的文件:文件消失但磁盘空间不释放,直到进程关闭(用 lsof 找占用)。
七、进阶:安全删除的几种真实姿势
rm 不可恢复,运维里更常见的需求是"既删得掉,又不至于手滑删库"。几种更稳的写法:
# 1. 先移到"待删区",确认几天后再清——给误操作留窗口
mkdir -p /tmp/trash && mv important.tmp /tmp/trash/
# 2. 删 30 天前的日志,先 -print 看清单再去掉 -print 执行 -delete
find /var/log -name "*.log" -mtime +30 -print
find /var/log -name "*.log" -mtime +30 -delete
# 3. 文件名以 -rf 开头删不掉,用 -- 终结选项解析
rm -- -rf-weird-file
# 4. 必须彻底销毁(防恢复)用 shred 覆写
shred -u -n 3 secret.key第 3 条很隐蔽:文件名以 -rf 开头时,rm -rf file 会把文件名当成选项解析。加 -- 告诉 rm"后面都是路径不是选项",或写成 rm ./--weird 同样安全。
八、边界情况的延伸
-r对符号链接只删链接本身,不会跟着删链接指向的真实目录——这和cp -r相反,务必记牢。- 大量文件
rm慢且卡 IO:上百万小文件时rm -rf长时间占满磁盘,用find ... -delete或rsync --delete更平滑。 - 空变量灾难:脚本里
set -u让$DIR为空时直接报错退出,别让rm -rf $DIR/把根目录干掉。 - 回收站思维:服务器没有桌面回收站,删前 mv 到
/tmp/trash比直接rm多一道保险,cron 定期清 trash 即可。
选型:普通清理
rm -rf;怕误删先 mv 进 trash;机密文件用 shred。别让$DIR为空就执行rm -rf。
相关命令
一句话总结
rm = 永久删除,不进回收站、不可恢复:目录必须 -r,-f 强制无提示,-i/-I 加确认护栏;给 rm 设 alias rm='rm -I' 或改用 trash-put 回收站是防误删底线;警惕 rm -rf "$DIR" 变量为空的删根灾难——删前先 ls 确认匹配范围。