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

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

通过阅读 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.cbar.o可以从 重建bar.c、并且可以从和myapp重建,则 makefile 目标foo.obar.o

clean:
        rm -f *.o myapp

删除myapp,如果它们存在foo.o并且bar.o如果它们不存在则不会抱怨。

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

答案3

切换-irm

我通常会看到当命令有别名时-f使用 with ,以便它包含交互式开关。该开关抵消了。rmrm-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就不必说“是”。

相关内容