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

Vil*_*age 141 bash rm

rm在BASH脚本中使用删除许多文件.有时文件不存在,因此会报告许多错误.我不需要这条消息.我在man页面搜索了一个让rm安静的命令,但我找到的唯一选项是-f,从描述中"忽略不存在的文件,从不提示",似乎是正确的选择,但名称似乎不合适所以我担心它可能会产生意想不到的后果.

  • -f选择沉默的正确方法rm?为什么不叫它-q
  • 这个选项还能做什么吗?

che*_*ner 191

主要用途-f是强制删除rm本身不会被删除的文件(作为特殊情况,它"删除"不存在的文件,从而抑制错误消息).

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

$ rm file.txt 2> /dev/null
Run Code Online (Sandbox Code Playgroud)

(或您的操作系统等效).您可以$? 在调用后立即检查rm文件是否实际被删除.

  • `2>` 中的 2 有什么作用? (4认同)
  • `--f`对GNU Coreutils`rm`有效,但仅仅因为它恰好是`--force`的唯一缩写.简短形式`-f`更清晰,更便携. (3认同)
  • 它不会在终端中打印错误,但它会像致命错误一样停止代码执行,因此它并没有真正解决问题...... (3认同)

Sat*_*tya 63

是的,-f是最合适的选择.

  • @vimdude:这不是"某些系统"; 该行为表明你有一个shell函数或别名,它将`rm`映射到`rm -i`. (9认同)

tec*_*rus 23

-f是正确的标志,但对于测试运算符,不是rm

[ -f "$THEFILE" ] && rm "$THEFILE"
Run Code Online (Sandbox Code Playgroud)

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

  • 但是,这具有竞争条件,不应在生产脚本中使用. (4认同)
  • 只是为了确认,竞争条件是某些东西可以删除 `test` 和 `rm` 之间的文件。在这里,“rm”不可能在“test”之前执行。在你跳跃之前先看是并发编程中的一个常见错误——当你真正“跳跃”时,你不能再相信“看”的结果;解决方案是使用锁定或原子操作。这正是你想要 `rm -f` 的原因,这是后者的一个例子。 (3认同)
  • 那应该怎么办? (2认同)
  • @robla 那个代码用更详细的语法做了同样的事情...... && != & ... 测试总是在 rm 之前发生,但是一个单独的进程可以在技术上(虽然不太可能)在 rm 运行之前删除它(而 shell解释测试后的代码)。 (2认同)

vim*_*ude 10

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

  • -r是不必要和危险的. (4认同)
  • @AymanSalah在这种情况下,反斜杠将转义任何包装真实`rm`的函数或别名(这在1990年代初期在某些站点上很流行,以防止初学者删除东西,然后调用sysadmin取回文件)。 (2认同)

Ide*_*lic 6

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