rm (remove) 是 Linux/Unix 系统中用于删除文件和目录的基础命令。它执行的是一次性、彻底的删除操作,被移除的文件通常难以通过常规手段恢复,这与图形界面中“移动到回收站”的概念截然不同。该命令功能强大,但风险也极高,尤其是在配合 -r (递归) 和 -f (强制) 选项使用时,一个误操作就可能导致数据永久丢失甚至系统崩溃。因此,深入理解 rm 的用法与安全规范,对于每一位从事 运维工作 的工程师而言,都是至关重要的基本素养。
1. 基本语法
| 命令 |
说明 |
rm [options] file... |
删除一个或多个文件 |
rm -r [options] directory... |
递归删除目录及其内容 |
rm -- filename |
将参数视为文件名(即使以 - 开头) |
rm -i file.txt |
删除前逐个提示确认 |
rm -f file.txt |
强制删除(忽略不存在的文件,不提示) |
2. 删除文件
| 命令 |
说明 |
rm file.txt |
删除单个文件 |
rm file1.txt file2.txt file3.txt |
删除多个文件 |
rm *.log |
删除所有匹配.log扩展名的文件 |
rm -- -strange-filename |
删除以 - 开头的文件 |
rm -v file.txt |
删除文件并显示详细信息 |
rm -f *.tmp |
强制删除临时文件(忽略不存在的) |
3. 删除目录
| 命令 |
说明 |
rm -r directory/ |
递归删除目录及其所有内容 |
rm -rf directory/ |
强制递归删除(不提示,最危险) |
rm -r dir1 dir2 |
删除多个目录 |
rm -r -- */ |
删除当前路径下的所有目录 |
rm -rf /path/to/dir |
删除指定路径的目录(谨慎使用) |
rmdir empty-dir/ |
仅删除空目录(更安全的替代) |
4. 提示与安全选项
| 选项 |
说明 |
-i |
删除每个文件前都提示确认 |
-I |
删除多个文件前提示一次(比 -i 少打扰) |
--interactive=always |
始终提示(同 -i) |
--interactive=once |
提示一次(同 -I) |
-f |
强制删除,忽略不存在的文件,永不提示 |
-v |
显示详细信息(删除时输出文件名) |
交互示例:
$ rm -I *.log
rm: remove 5 arguments? (y/N) y
5. 安全删除模式
| 命令/技巧 |
说明 |
rm -i file.txt |
删除前确认 |
alias rm='rm -i' |
设置别名,默认交互模式 |
ls file* && rm file* |
先确认再删除 |
find . -name "*.tmp" -delete |
使用find的-delete替代rm |
rm -rf -- /path/to/trash/* |
删除前确保路径正确 |
mkdir -p ~/.trash; mv file.txt ~/.trash/ |
使用“垃圾桶”机制 |
防止误删除根目录:
# rm -rf / 是极度危险的命令
# 现代rm实现会阻止删除根目录,除非使用 --no-preserve-root
rm -rf --no-preserve-root / # 极其危险!切勿执行!
6. 实用组合模式
| 命令 |
说明 |
find . -type f -name '*.tmp' -delete |
删除所有临时文件 |
find . -type d -empty -delete |
删除所有空目录 |
rm -rf -- build/ dist/ node_modules/ |
删除常见构建目录 |
rm -f -- *.bak *.old *.orig |
安静删除备份文件 |
rm -rf !(keep.txt) |
删除除keep.txt外的所有文件(需开启extglob) |
shopt -s extglob; rm -rf !(keep|save) |
删除除keep和save外的所有文件 |
ls -1 | grep -v '^keep' | xargs rm -rf |
删除除keep外的所有文件(复杂版) |
7. 通配符使用技巧
| 模式 |
说明 |
* |
匹配任意字符串(0个或多个字符) |
? |
匹配任意单个字符 |
[abc] |
匹配a、b或c中的任意一个 |
[a-z] |
匹配任意小写字母 |
{foo,bar} |
匹配foo或bar(花括号扩展) |
!pattern |
不匹配指定模式(需启用extglob) |
示例:
rm file[0-9].txt # 删除file0.txt到file9.txt
rm file{a,b,c}.log # 删除filea.log, fileb.log, filec.log
rm *.?? # 删除扩展名为2个字符的文件
8. 替代方案(更安全)
| 替代命令 |
说明 |
trash-put file.txt |
将文件移动到回收站(需安装trash-cli) |
mv file.txt ~/.local/share/Trash/files/ |
手动移动到回收站 |
rmdir empty-dir/ |
仅删除空目录(不会误删内容) |
find . -delete |
find内置删除,比 -exec rm 更安全 |
unlink file.txt |
删除单个文件(不能删除目录) |
9. 常用选项速查
| 选项 |
完整名称 |
说明 |
-r |
--recursive |
递归删除目录及其内容 |
-R |
--recursive |
同 -r |
-f |
--force |
强制删除,忽略不存在的文件,不提示 |
-i |
--interactive |
删除前逐个提示 |
-I |
--interactive=once |
删除多个文件前提示一次 |
-v |
--verbose |
显示详细信息 |
-d |
--dir |
删除空目录(通常用 -r 替代) |
--no-preserve-root |
- |
允许删除根目录(危险!) |
--preserve-root |
- |
保护根目录(默认) |
10. 故障排查
| 问题 |
解决方法 |
| Permission denied |
检查文件所有者和权限;使用 sudo(仅必要时) |
| Is a directory |
删除目录需使用 -r 选项 |
| No such file or directory |
检查路径和通配符展开是否正确 |
文件名以 - 开头无法删除 |
使用 rm -- -filename |
| 通配符删除过多文件 |
先用 ls 测试通配符;使用 -i 或 -I 确认 |
| 删除后磁盘空间未释放 |
文件可能仍被进程占用,使用lsof命令查看 |
| rm -rf / 误执行 |
立即停止操作;从备份恢复(务必提前备份) |
11. 防范误删除的最佳实践
# 设置别名:
alias rm='rm -i' # 默认交互模式
alias rm='rm -I' # 批量删除时提示一次
# 使用垃圾桶机制:
# 在~/.bashrc中添加
alias trash='mv -t ~/.trash'
mkdir -p ~/.trash
# 定期备份:
# 重要数据定期备份
rsync -av /important/data /backup/
# 避免使用root删除:
# 尽量使用普通用户,需要时才sudo
# 删除前确认:
# 删除前先用ls确认
ls file* && rm file*
温馨提示: rm 是把双刃剑,功能强大但风险极高。永远不要执行 rm -rf /、rm -rf /*、rm -rf ./* 等危险命令。删除前建议:1)使用 ls 或 find 预览匹配结果;2)使用 -i 或 -I 选项确认;3)养成定期备份习惯;4)考虑使用 trash-cli 等工具代替直接删除。在脚本中使用 rm 时,务必使用双引号包围变量路径,避免路径为空时意外删除根目录。请牢记,删除操作往往是永久性的,谨慎永远不为过!
|