我有一个 bash 脚本,我想从各个目录中删除文件。通常,它们不会在那里,因为它们不是生成的,但这没关系。有没有办法让脚本不报告该错误,但如果 rm 有其他输出来报告该错误?
或者,是否有更好的命令可用于删除噪音较小的文件?
答案1
使用该-f
选项。它会默默地忽略不存在的文件。
从man rm
:
-f, --force
ignore nonexistent files and arguments, never prompt
[“从不提示”部分意味着 (a)-f
覆盖任何先前指定的-i
或-I
选项,以及 (b) 写保护的文件将在不询问的情况下被删除。]
例子
如果没有-f
,rm
会抱怨丢失文件:
$ rm nonesuch
rm: cannot remove ‘nonesuch’: No such file or directory
使用-f
,它将保持沉默:
$ rm -f nonesuch
$
答案2
如果您的要求是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
答案3
您表示您仍然希望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,因此运行该命令时您将看不到它。
答案4
作为替代方案,您可以使用find
带有-delete
选项的命令。这(显然)只会删除它找到的文件,因此如果没有,它永远不会发出警告。一个例子可能是:
find /var/log/triffids/ -name "*.log" -mtime 30 -delete
会搜索/var/log/triffids/
目录并删除所有.log
超过30天未修改过的后缀名的文件。
运行这些命令总是一个好主意没有首先选择该-delete
选项,以确保它找到您期望的文件。