Skip to content

rm 命令详解:删除文件和目录(高危,慎之又慎) ​

本文是 Linux 命令速查 中 rm 的从 0 到 1 详解。 目标:把 rm --help 里的每个选项讲清楚,多看几遍后,你在服务器上敲 rm --help 就知道该用哪个选项。 环境依据:GNU coreutils 8.32(Ubuntu 22.04 自带;RHEL/Rocky 自带版本用法一致)。

本命令是"删了就没了"

Linux 命令行没有回收站。rm 删掉的东西默认无法从图形界面"回收站"找回。请把本篇读完整再上手,尤其别在不明白路径时用 -rf。

一、命令是干什么的 ​

rm 是 remove(删除) 的缩写,用来删掉文件和目录。

  • 删文件:rm 文件;
  • 删目录:必须加 -r(递归);
  • 默认不删目录,也不询问(很多发行版会别名成询问)。

类比:它像 Windows 的"Shift + Delete"——不进回收站,直接彻底删除。Linux 里没有图形回收站兜底,删错就是真删错。

属于 GNU coreutils。

二、命令语法 ​

bash
rm [选项]... 文件...
  • [选项]:可选,控制递归、是否询问、是否强制;
  • 文件:要删谁,可以一次给多个。

最简单的用法:

bash
rm 某文件.txt

默认 rm 不删目录,只删文件;删目录要 -r。

三、选项全表(对照 rm --help) ​

1. 控制"问不询问" ​

选项中文含义什么场景用
-i每删一个都问一次极度谨慎时(文件多时烦死你)
-I删超过 3 个、或递归删时只问一次比 -i 省事又有基本保护
--interactive[=WHEN]WHEN 取 never/once(=-I)/always(=-i)精细控制询问级别
-f,--force从不询问,文件不存在也不报错脚本里无人值守删除(危险)

2. 控制"删不删目录" ​

选项中文含义什么场景用
-r,-R,--recursive递归删除目录及其全部内容删整个文件夹时必加(高危)
-d,--dir只删空目录(rmdir 同款)清理空文件夹

3. 安全保护 ​

选项中文含义什么场景用
--preserve-root默认就保护 /,不允许删根默认开启,别关
--no-preserve-root取消对 / 的特殊保护绝对不要用,除非你知道后果
--one-file-system递归删时跳过别的文件系统避免连带删掉挂载点内容

4. 其他 ​

选项中文含义什么场景用
-v,--verbose打印每删一个文件看它删了什么

四、由浅入深的典型示例 ​

示例 1:删单个文件 ​

bash
touch f1.txt f2.txt f3.txt
rm f1.txt
ls
text
f2.txt
f3.txt

示例 2:删空目录用 -d,删非空目录用 -r ​

bash
mkdir emptydir
rm -d emptydir

空目录被删掉。再试非空目录:

bash
mkdir -p proj/sub
rm proj
text
rm: cannot remove 'proj': Is a directory
bash
rm -r proj

加了 -r 才把 proj 连同里面的 sub 一起删掉。

示例 3:-i 逐个询问 ​

bash
touch g1 g2
echo y | rm -i g1
ls
text
rm: remove regular empty file 'g1'? f2.txt
f3.txt
g2

每删一个都会问 y/n,这里喂了 y。

示例 4:-f 强制,不存在也不报错 ​

bash
touch h1
rm -f h1 nonexistent_xxx

h1 被删;那个不存在的文件也不报错(这正是 -f 的特点)。脚本里常用来"确保某文件不存在"。

示例 5:删名字以 - 开头的文件 ​

bash
touch -- -weird.txt
rm -- -weird.txt

文件名是 -weird.txt,直接 rm -weird.txt 会被当成选项。用 -- 告诉它"后面没有选项了",或写 rm ./-weird.txt。

示例 6:-I 批量删前只问一次 ​

bash
touch k1 k2 k3 k4
rm -I k1 k2 k3 k4
text
rm: remove 4 arguments?

删超过 3 个时它只问一次,比 -i 清爽。

示例 7:组合 -rf(高危,仅用于你确认无误的目录) ​

bash
rm -rf build/

递归删除 build/ 且不询问。这是运维事故第一名,详见易错点。

五、高频组合速记 ​

命令用途
rm 文件删一个文件
rm -r 目录删整个目录
rm -i 文件删之前问一下
rm -f 文件不询问、不存在也不报错
rm -rf 目录/递归强制删(高危,最易出事)
rm -d 空目录删空目录

六、RHEL 系与 Debian 系差异 ​

rm 属于 GNU coreutils,两系主用法一致。细微差别:

  • RHEL 系默认对 rm 有别名 alias rm='rm -i'(删前询问),脚本里要用 command rm 或 /bin/rm 绕过别名;
  • Ubuntu 桌面一般不默认别名 rm -i;
  • 新版 coreutils 默认开启 --preserve-root,误敲 rm -rf / 会被拦下,这是两系共同的安全网。

七、新手易错点(重点) ​

  1. rm -rf / 或 rm -rf $变量/ 是自杀命令:变量为空时会变成 rm -rf /,直接清盘。写脚本删除前先 echo "$DIR" 确认变量非空、路径正确。
  2. rm -rf 目录 * 中间多了个空格:rm -rf build * 会被解析成"删 build + 删当前目录所有东西"!永远不要在 -rf 后面打空格再跟 *。
  3. 没有回收站:删之前先 ls 要删的路径 看清楚;重要数据先备份。
  4. -rf 能不用就不用:优先 -r -i 或先 ls -R 看一遍再删。
  5. 通配符先预览:rm *.log 之前先 ls *.log,确认范围不是你以为的范围(比如别在 / 下 rm *.log)。
  6. 不要 sudo rm -rf 玩闹:root 权限下删除没有任何补救余地。
  7. 文件名带空格/横杠:用引号包起来,或用 -- 分隔,否则被拆成多个参数。

八、相关命令与文档 ​

  • 速查页:Linux 命令速查
  • 建文件/目录(删错了可以重建对照):touch(详解见 touch)、mkdir(详解见 mkdir)
  • 移动代替删除(后悔药):mv(详解见 mv)
  • 按条件批量删除:先 find 路径 -name '*.tmp' 预览,再删
  • 文件删除与 inode 原理:见 Linux 文件系统