当文件丢失时,rm 没有报告吗?

fli*_*fly 81 rm

我有一个 bash 脚本,我想从各个目录中删除文件。通常,它们不会在那里,因为它们不是生成的,这很好。有没有办法让脚本不报告该错误,但如果 rm 有其他一些输出来报告该错误?

或者,是否有更好的命令来删除噪音较小的文件?

Joh*_*024 127

使用该-f选项。它会默默地忽略不存在的文件。

来自man rm

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

[“从不提示”部分意味着 (a)-f覆盖任何先前指定的-i-I选项,并且 (b) 将不经询问就删除写保护的文件。]

例子

没有-f,rm会抱怨丢失的文件:

$ rm nonesuch
rm: cannot remove ‘nonesuch’: No such file or directory
Run Code Online (Sandbox Code Playgroud)

使用-f,它将保持沉默:

$ rm -f nonesuch
$
Run Code Online (Sandbox Code Playgroud)

  • 哦,我新的没有提示删除,没有意识到它也忽略了不存在的东西。在看男人时,我完全跳过了这一点。:-) 谢谢。我会尽快将其标记为答案。 (6认同)

Jef*_*ler 12

如果你的要求是rm不抱怨缺少的文件,但你也想任何其他的输出rm,我的建议是先行先试目标文件的存在,只有调用rm没有-f标志),如果该文件确实存在。

# rest of script
# ...
[ -e "$file" ] && rm "$file"
# ...
# rest of script
Run Code Online (Sandbox Code Playgroud)

rm -f例如,调用一个没有用户写入权限的文件将删除该文件,并且也不会发出该场景的正常提示。

如果您想对多个文件使用相同的想法,我将创建一个函数定义,例如:

qrm() {
  for f
  do
    [ -e "$f" ] && rm "$f"
  done
}
Run Code Online (Sandbox Code Playgroud)

像这样使用它: qrm file1 file2-does-not-exist *.txt etc here

  • 值得注意的是,在测试和删除之间删除(或创建)文件的竞争条件的可能性很小,但我无法想象这与使用 shell 脚本的任何典型情况相关. (2认同)

Bri*_*Guy 8

您表示rm在运行该命令时仍希望看到该命令的其他输出,但使用该-f选项会抑制这些输出。您将需要根据您想要的内容过滤 STDERR,这有点棘手,因为您希望显示其他所有内容。

你会想要使用这样的命令:

rm -f filename 3>&1 1>&2 2>&3 3>&- | grep -v 'No such file or directory'
Run Code Online (Sandbox Code Playgroud)

命令解释:

  • -f 论点是强制通过而不是提示确认或错误
  • 3>&1 1>&2 2>&3 3>&-是切换 STDOUT 和 STDERR 进行过滤(如果需要,您可以在此处阅读更多相关信息
  • | grep -v 'No such file or directory' 正在过滤掉您不想看到的消息

现在,如果您只想完全抑制错误消息,可以运行以下命令:

rm filename 2> /dev/null
Run Code Online (Sandbox Code Playgroud)

此命令将 STDERR 重定向到 /dev/null,因此您在运行该命令时不会看到它。


小智 5

这是一种黑客行为,但您始终可以touch删除要删除的文件。如果它不存在,则会创建它,以便rm可以将其删除。


seu*_*mac 5

作为替代方法,您可以使用find带有-delete选项的命令。这将(显然)只删除它找到的文件,因此如果没有,它永远不会发出警告。一个例子可能是:

find /var/log/triffids/ -name "*.log" -mtime 30 -delete
Run Code Online (Sandbox Code Playgroud)

它将搜索/var/log/triffids/目录并删除所有.log超过 30 天未修改的带有后缀的文件。

它始终是运行这些命令是个好主意,而不-delete第一个选项,以确保它的找到你所期望的文件。