rm 上 -f 选项的真正意义是什么?

sal*_*rus 19 options coreutils rm

通过阅读 GNU coreutils 手册页rm,其中一个选项是-f,根据手册,

-f, --force
          ignore nonexistent files and arguments, never prompt
Run Code Online (Sandbox Code Playgroud)

现在,我做了一些测试并证明如果我使用类似的东西

rm -f /nonexisting/directory/
Run Code Online (Sandbox Code Playgroud)

它不会抱怨。

人们可以从这样的选择中真正获得什么?

另外,使用“删除目录”的最常见示例rm类似于

 rm -rf /delete/this/dir
Run Code Online (Sandbox Code Playgroud)

这个-r选项是有道理的,但是-f

phu*_*ehe 12

我发现手册页在这种情况下缺少一些细节。的-f选项rm实际上有很多用例:

  • 避免错误退出代码
  • 避免被提示
  • 绕过权限检查

您是对的,删除不存在的文件是没有意义的,但是在脚本中,能够说“我不想要这些文件,如果找到它们就删除它们,但如果它们不存在,请不要打扰我,这真的很方便不存在”。有些人set -e在他们的脚本中使用 ,以便它会在出现任何错误时停止(以避免脚本可能造成的任何进一步损坏),并且rm -rf /home/my/garbageif [[ -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
Run Code Online (Sandbox Code Playgroud)

因此,如果您使用rm,则在不使用的情况下删除 Git 存储库的唯一方法root是使用rm -rf.

  • `-f` 不会避免错误退出代码。如果 rm 尝试删除现有文件但失败,它将返回错误代码。 (4认同)
  • 我否决了这个答案,因为“为了避免错误退出代码”应该写为“为了避免在没有文件操作数或文件操作数不存在的情况下出现错误退出代码”。现在写这个答案是错误的。 (2认同)

Gil*_*il' 6

-f选项在删除只读文件时禁止确认提示。当一个或多个提供的文件不存在时,它还抑制错误。

-f当您知道要删除的某些文件可能是只读的,并且您不想收到有关它的提示时,该选项很有用。

f当您想删除某些文件以防它们存在并且不想关心它们是否存在时,该选项也很有用。这在makefiles 中非常常用,用于创建一个命令,删除可以从源文件中重新生成的文件。例如,如果foo.o可以从 重建foo.cbar.o可以从 重建bar.c,并且myapp可以从foo.o和重建bar.o,那么 makefile 目标

clean:
        rm -f *.o myapp
Run Code Online (Sandbox Code Playgroud)

removes myapp,如果它们存在,foo.o并且bar.o如果它们中的任何一个不存在,则不会抱怨。

-f在大多数情况下,不需要包含在删除目录树的说明中。这是有道理的,因为如果您确定要删除该目录树,而不管其中包含什么,那么您可以指定-f避免在某些文件是只读的情况下收到提示。然而,人们对谁跑说rm -rf往往只是在重复一个神秘的咒语摆脱的东西,不管是否选择-r-f有实际需要。如果选项不是必需的,则不建议使用,因为它们会增加论证中的拼写错误会破坏重要内容的风险。