通过阅读 GNU coreutils 手册页rm
,选项之一是-f
,根据手册,
-f, --force
ignore nonexistent files and arguments, never prompt
现在,我做了一些测试并表明,如果我使用类似的东西
rm -f /nonexisting/directory/
它不会抱怨。
人们可以从这样的选择中真正获得什么?
另外,最常见的“删除目录”示例rm
如下:
rm -rf /delete/this/dir
这个-r
选项是有道理的,但是-f
?
答案1
我发现手册页在这种情况下缺少一些细节。这个-f
选项rm
实际上有很多用例:
- 避免出现错误退出代码
- 为了避免被提示
- 绕过权限检查
你是对的,删除一个不存在的文件是没有意义的,但在脚本中,能够说“我不想要这些文件,如果找到它们就删除它们,但如果它们不存在,请不要打扰我,这真的很方便”不存在”。有些人在他们的脚本中使用set -e
,以便它会在出现任何错误时停止(以避免脚本可能造成的任何进一步损坏),并且rm -rf /home/my/garbage
比 更容易if [[ -f /home/my/garbage ]]; then rm -r /home/my/garbage; fi
。
关于权限检查的注意事项:要删除文件,您需要对该文件的写入权限家长目录,而不是文件本身。因此,假设root
您的主目录中有一个文件,而您无权sudo
访问,您仍然可以使用该选项删除该文件-f
。如果您使用 Git,您可以看到 Git 不会保留其创建的对象文件的写入权限:
-r--r--r-- 1 phunehehe phunehehe 62 Aug 31 15:08 testdir/.git/objects/7e/70e8a2a874283163c63d61900b8ba173e5a83c
因此,如果您使用rm
,删除 Git 存储库而不使用的唯一方法root
就是使用rm -rf
。
答案2
该-f
选项在删除只读文件时禁止出现确认提示。当一个或多个提供的文件不存在时,它还会抑制错误。
-f
当您意识到要删除的某些文件可能是只读的,并且您不希望收到相关提示时,该选项非常有用。
f
当您想要删除某些文件(以防它们存在)并且不想关心它们是否存在时,该选项也很有用。这非常常用在生成文件,创建一个命令来删除可以从源文件重新生成的文件。例如,如果foo.o
可以从 重建foo.c
、bar.o
可以从 重建bar.c
、并且可以从和myapp
重建,则 makefile 目标foo.o
bar.o
clean:
rm -f *.o myapp
删除myapp
,如果它们存在foo.o
并且bar.o
如果它们不存在则不会抱怨。
-f
在大多数情况下,不需要在说明中包含删除目录树的内容。这是合理的,因为如果您确定要删除该目录树,无论其中有什么内容,那么您可以指定-f
避免在某些文件是只读的情况下出现提示。然而,那些说要逃跑的人rm -rf
往往只是重复一个神秘的咒语来摆脱某些东西,而不管选项-r
和-f
实际上是否有必要。如果这些选项不是必需的,则不建议使用它们,因为它们会增加论证中的拼写错误破坏重要内容的风险。
答案3
切换-i
到rm
我通常会看到当命令有别名时-f
使用 with ,以便它包含交互式开关。该开关抵消了。rm
rm
-i
-f
-i
例子
rm
模拟使用别名的问题rm -i
。
$ alias rm='rm -i'
制作一些假数据
$ touch afile
现在尝试使用别名版本删除它rm
$ rm afile
rm: remove regular empty file `afile'?
现在尝试使用-f
$ rm -f afile
$
权限
另外,我相信在某些情况下,您对目录具有只读访问权限,当您尝试删除该目录中的文件和/或子目录时,您会遇到类似的提示“您确定吗?”。使用“”-f
就不必说“是”。