如何防止rm报告未找到文件?


155

rm在BASH脚本中使用它来删除许多文件。有时文件不存在,因此报告许多错误。我不需要此消息。我已经在手册页中搜索了使命令rm安静的命令,但是我发现的唯一选择是-f,从描述中“忽略不存在的文件,从不提示”似乎是正确的选择,但名称似乎不合适,因此我担心它可能会带来意想不到的后果。

  • -f选择沉默的正确方法rm?为什么不叫它-q呢?
  • 这个选项还有其他作用吗?

4
您不想使用-f,它将删除标记为只读的文件。
披萨

Answers:


209

的主要用途-f是强制删除rm本身不会删除的文件(在特殊情况下,它会“删除”不存在的文件,从而消除了错误消息)。

您也可以使用以下命令重定向错误消息

$ rm file.txt 2> /dev/null

(或您的操作系统的等效版本)。您可以$? 在调用后立即检查的值,rm以查看是否确实删除了文件。


3
--f对GNU Coreutils是有效的rm,但这仅是因为它恰好是GNU Coreutils 的唯一缩写--force。简写形式-f更清晰,更便于携带。
基思·汤普森

不知道我什至意识到这一点。--f这只是的错字-f
chepner 2014年

2
2 in有2>什么作用?

@Maverick它将发送到stderr的所有消息重定向到/ dev / null,而不是将其发送到终端。
本杰明·诺兰

73

是的,这-f是最合适的选择。


某些系统甚至在使用-f时都会提示您何时进行腾空,直到您使用反斜杠为止。
vimdude 2013年

11
@vimdude:不是“某些系统”;该行为表明您具有映射rm到的shell函数或别名rm -i
基思·汤普森

27

-f是正确的标志,但对于测试操作员,不是rm

[ -f "$THEFILE" ] && rm "$THEFILE"

这样可以确保该文件存在并且是常规文件(不是目录,设备节点等)。


4
但是,这具有争用条件,因此不应在生产脚本中使用。
2014年

我相信@tripleee指出的是,“-f”测试和文件删除可以按任何顺序完成。另一种方法是:if [ -f "$THEFILE" ]; then rm "$THEFILE"; fi,它使测试和文件删除步骤明确地顺序进行。
robla

2
@robla该代码使用更冗长的语法执行相同的操作... &&!=&...该测试将始终在rm之前进行,但从技术上(尽管可能性很小),可以在rm运行之前(尽管在shell中)将其单独删除测试后的代码)。
technosaurus

技术龙-糟糕,您是对的。您认为@mmlac问题的最佳答案是什么?
robla

3
而刚刚确认,竞态条件是,事情就可以删除的文件testrmrmtest此之前无法执行任何方法。在并发编程中常见的一个常见错误是在跳动之前先查看-当您实际“跨越”时,您再也无法相信“外观”的结果;解决方案是使用锁定或原子操作。这正是您想要的原因rm -f,这就是后者的一个示例。
人间

13

\rm -f file 永远不会报告找不到。


4
-r是不必要且危险的。
mahemoff 2013年

1
我假设有许多文件或目录。重读用户的请求,您说对了,他只要求文件。所以更正了我的答案
vimdude 2013年

rm在做之前的反斜杠是什么?拜托,我需要一个答案。在Windows上,cygwin的make版本4.1不能处理\ rm,而3.75可以正常工作。
艾曼萨拉

2
@AymanSalah在这种情况下,反斜杠将转义任何包裹实数的函数或别名rm(这在1990年代初期在某些站点上很流行,以防止初学者删除内容,然后调用sysadmin取回他们的文件)。
Tripleee

谢谢-这解决了我的问题..显然,退出代码允许使用链接,&&而没有-f的链接将在找不到文件后中断。
伊戈尔

5

至于rm -f做“其他任何事情”,它确实会强迫(-f是简写--force)在其他情况下rm会要求您进行确认的静默删除。例如,当尝试从您可写的目录中删除您不可写的文件时。


-9

我对cshell也有同样的问题。我唯一的解决方案是在脚本中的“ rm”之前创建一个与模式匹配的虚拟文件。


7
那真的是唯一的解决方案吗?您尝试过rm -f还是rm filename >&/dev/null
基思·汤普森
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.