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


14

通过阅读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

Answers:


9

我发现在这种情况下手册页缺少一些细节。实际上,该-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


4
-f不能避免错误退出代码。如果rm尝试删除现有文件失败,它将返回错误代码。
吉尔斯(Gillles)“所以-不要再邪恶了”

我对这个答案不满意,因为“避免错误退出代码”应写为“在没有文件操作数或文件操作数不存在的情况下避免错误退出代码”。现在写的是这个答案,这是错误的。
哈罗德·菲舍尔

6

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

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

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

clean:
        rm -f *.o myapp

移除了myappfoo.o并且bar.o如果它们存在,如果其中任何一个不存在不抱怨。

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


3

-i开关rm

我通常会在命令-f加上别名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摆脱了不得不说“是”的麻烦。


通过使用别名,确实可以理解。您的答案与我在openbsd手册页中显示的内容相符。尽管openbsd不是GNU / Linux,但它似乎描述了您刚才所说的内容。如果有人要检查,请点击以下链接:[link] openbsd.org/cgi-bin/…–
saliarosaurus

使用bash,您始终\rm可以在不使用别名的情况下运行(\是command构建它的快捷方式)。我发现,最好的用法-f是在shell脚本中,其中有诸如锁文件之类的东西可能不存在,可以-f停止rm: cannot remove 'file': No such file or directory警告。
Drav Sloan

@DravSloan是的,这也很有意义。谢谢您的回答Drav Sloan和slm
saliarosaurus

rm -f经常cleanMakefiles 上使用目标
Alex

-i并不是真正的意义-f,更多的是边缘情况。
吉尔斯(Gillles)“所以-不要再邪恶了”
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.