Linux中rm -rf与rm -r命令的区别是什么?
rm -r 和 rm -rf 的核心区别 嘿,我来给你掰扯清楚这俩命令的差异——虽然你测试时看起来效果一样,但本质上它们在处理权限受限的文件/目录以及错误提示时完全不同!
核心参数解析
rm -r:这里的-r是--recursive(递归)的缩写,它会遍历并删除目标目录下的所有内容(包括子目录和文件)。但遇到只读文件/目录时,它会停下来询问你是否确认删除,必须手动输入y才能继续。rm -rf:在-r的基础上多了-f(--force,强制)参数,它的作用有两个:- 跳过所有确认提示,不管文件权限是只读还是其他,直接强制删除;
- 忽略“目标不存在”这类错误提示,不会输出报错信息,默默执行。
结合你的测试场景看差异
你测试时创建的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




