You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Linux中rm -rf与rm -r命令的区别是什么?

rm -rrm -rf 的核心区别

嘿,我来给你掰扯清楚这俩命令的差异——虽然你测试时看起来效果一样,但本质上它们在处理权限受限的文件/目录以及错误提示时完全不同!

核心参数解析

  • rm -r:这里的-r--recursive(递归)的缩写,它会遍历并删除目标目录下的所有内容(包括子目录和文件)。但遇到只读文件/目录时,它会停下来询问你是否确认删除,必须手动输入y才能继续。
  • rm -rf:在-r的基础上多了-f--force,强制)参数,它的作用有两个:
    1. 跳过所有确认提示,不管文件权限是只读还是其他,直接强制删除;
    2. 忽略“目标不存在”这类错误提示,不会输出报错信息,默默执行。

结合你的测试场景看差异

你测试时创建的main.java都是默认权限(可写),所以用rm -r foo1的时候不会触发任何询问,和rm -rf foo1的表现完全一致。但如果换成只读文件,差异立刻就出来了:

比如我们创建一个只读文件试试:

mkdir test && touch test/readonly.txt && chmod 444 test/readonly.txt
  • 执行rm -r test,系统会弹出提示:
    rm: remove write-protected regular file 'test/readonly.txt'?
    
    必须输入y才能完成删除;
  • 执行rm -rf test,则会直接删除整个目录和里面的文件,全程没有任何提示。

再举个不存在文件的例子:

  • rm -r non_exist_dir会报错:rm: cannot remove 'non_exist_dir': No such file or directory
  • rm -rf non_exist_dir则不会输出任何内容,直接跳过错误。

你的测试操作代码:

mohammad@mohammad-ThinkPad-E570:~/testerr$ ls
mohammad@mohammad-ThinkPad-E570:~/testerr$ mkdir foo1 foo2
mohammad@mohammad-ThinkPad-E570:~/testerr$ touch foo1/main.java foo2/main.java
mohammad@mohammad-ThinkPad-E570:~/testerr$ tree .
├── foo1
│   └── main.java
└── foo2
    └── main.java
2 directories, 2 files

简单总结:如果确定要删除的内容都是可写的,两者效果一样;但处理只读文件或者想避免烦人的确认提示、错误提示时,-rf才是你需要的。

内容的提问来源于stack exchange,提问作者mdash1

火山引擎 最新活动