主题
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
lstext
f2.txt
f3.txt示例 2:删空目录用 -d,删非空目录用 -r
bash
mkdir emptydir
rm -d emptydir空目录被删掉。再试非空目录:
bash
mkdir -p proj/sub
rm projtext
rm: cannot remove 'proj': Is a directorybash
rm -r proj加了
-r才把proj连同里面的sub一起删掉。
示例 3:-i 逐个询问
bash
touch g1 g2
echo y | rm -i g1
lstext
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 k4text
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 /会被拦下,这是两系共同的安全网。
七、新手易错点(重点)
rm -rf /或rm -rf $变量/是自杀命令:变量为空时会变成rm -rf /,直接清盘。写脚本删除前先echo "$DIR"确认变量非空、路径正确。rm -rf 目录 *中间多了个空格:rm -rf build *会被解析成"删 build + 删当前目录所有东西"!永远不要在-rf后面打空格再跟*。- 没有回收站:删之前先
ls 要删的路径看清楚;重要数据先备份。 -rf能不用就不用:优先-r -i或先ls -R看一遍再删。- 通配符先预览:
rm *.log之前先ls *.log,确认范围不是你以为的范围(比如别在/下rm *.log)。 - 不要
sudo rm -rf玩闹:root 权限下删除没有任何补救余地。 - 文件名带空格/横杠:用引号包起来,或用
--分隔,否则被拆成多个参数。
八、相关命令与文档
- 速查页:Linux 命令速查
- 建文件/目录(删错了可以重建对照):
touch(详解见 touch)、mkdir(详解见 mkdir) - 移动代替删除(后悔药):
mv(详解见 mv) - 按条件批量删除:先
find 路径 -name '*.tmp'预览,再删 - 文件删除与 inode 原理:见 Linux 文件系统