我有一个 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)
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
您表示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,因此您在运行该命令时不会看到它。
作为替代方法,您可以使用find带有-delete选项的命令。这将(显然)只删除它找到的文件,因此如果没有,它永远不会发出警告。一个例子可能是:
find /var/log/triffids/ -name "*.log" -mtime 30 -delete
Run Code Online (Sandbox Code Playgroud)
它将搜索/var/log/triffids/目录并删除所有.log超过 30 天未修改的带有后缀的文件。
它始终是运行这些命令是个好主意,而不在-delete第一个选项,以确保它的找到你所期望的文件。