缺少文件时,rm是否没有报告?


38

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

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

Answers:


65

使用该-f选项。它将无提示地忽略不存在的文件。

来自man rm

   -f, --force
          ignore nonexistent files and arguments, never prompt

[“从不提示”部分表示(a)-f覆盖了先前指定的任何内容-i-I选项,并且(b)写保护的文件将被删除而无需询问。]

如果没有-frm则会抱怨文件丢失:

$ rm nonesuch
rm: cannot remove ‘nonesuch’: No such file or directory

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

$ rm -f nonesuch
$

4
哦,我的新手没有提示您删除,也没有意识到它也忽略了不存在的内容。当我看着男人时,我完全跳过了那件事。:-) 谢谢。允许的话,我会立即将此标记为答案。
flickerfly '16

9

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

# rest of script
# ...
[ -e "$file" ] && rm "$file"
# ...
# rest of script

rm -f例如,调用没有用户写权限的文件,将会删除该文件也不会发出该情况下的正常提示。

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

qrm() {
  for f
  do
    [ -e "$f" ] && rm "$f"
  done
}

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


1
值得一提的是,在测试和删除之间删除(或创建)文件时出现竞争状况的可能性很小,但是我无法想象这与使用shell脚本的任何典型情况相关。 。
David Z

7

您说过,您仍然希望rm在运行命令时看到命令的其他输出,但是使用该-f选项将禁止这些输出。考虑到要显示的所有其他内容,您将需要过滤STDERR以获取所需内容,这有点棘手。

您将要使用如下命令:

rm -f filename 3>&1 1>&2 2>&3 3>&- | grep -v 'No such file or directory'

命令说明:

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

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

rm filename 2> /dev/null

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


1
(AFAICS)rm没有-v永远输出到标准输出,标准错误只,所以在这种情况下,你可以只是2>&1 | grep没有舞蹈这是有用的更普遍,
dave_thompson_085

4

或者,您可以将find命令与-delete选项一起使用。(显然)这只会删除找到的文件,因此即使没有找到,也不会发出警告。一个示例可能是:

find /var/log/triffids/ -name "*.log" -mtime 30 -delete

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

最好先运行这些命令而不使用-delete选项,以确保找到所需的文件。


我喜欢这个选项,并会考虑进行更改。感谢分享。
flickerfly '16

3

检查以下项的--force-f)选项rm

-f,--force

忽略不存在的文件和参数,从不提示


2

这是一个hack,但是您始终可以随时touch删除该文件。如果不存在,它将被创建,因此rm可以将其删除。


我喜欢这样,除了性能-触摸几个K文件而不是只删除不存在的文件要花多少钱?
Dani_l

0

您可以-f根据手册页使用它:

无论文件的权限如何,都尝试删除文件而不提示您进行确认。如果该文件不存在,则不显示诊断消息或修改退出状态以反映错误。还请记住,-f选项将覆盖以前的任何-i选项。

rm -f xyz-directory

不会提示您任何事情,并且会完全按照您的意愿进行。


-1

主要有两种方法:如果添加-f选项,它将不会显示“不存在”错误;另外两种是:(适用于几乎所有命令)而不是仅执行“ thecommand”,而是执行“ thecommand 2> / dev” / null”,其中“ thecommand”是您正在执行的命令。


1
我之所以避免使用管道,是因为我不想散失可能出现的其他错误。我不知道他们会是什么。
flickerfly '16
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.