如果没有文件,请处理gsutil ls和rm命令错误

use*_*888 4 gsutil

我正在运行以下命令,以从gcs存储桶中删除文件,然后再在其中加载新文件。

gsutil -m rm gs://mybucket/subbucket/*
Run Code Online (Sandbox Code Playgroud)

如果存储桶中没有文件,它将引发“ CommandException:一个或多个URL与对象不匹配”。

我希望它删除文件(如果存在)而不会引发错误。

有相同的错误 gsutil ls gs://mybucket/subbucket/*

如何重写此代码而不必显式处理异常?或者,如何最好地在批处理脚本中处理这些异常?

Ell*_*ard 9

尝试这个:

gsutil -m rm gs://mybucket/foo/* 2> /dev/null || true
Run Code Online (Sandbox Code Playgroud)

要么:

gsutil -m ls gs://mybucket/foo/* 2> /dev/null || true
Run Code Online (Sandbox Code Playgroud)

这具有抑制stderr(针对/dev/null)的作用,甚至在失败时也返回成功错误代码。


小智 6

您可能不想忽略所有错误,因为它可能指示未找到文件的不同内容。使用以下脚本,您将仅忽略“一个或多个与对象不匹配的 URL”,但会通知您不同的错误。如果没有错误,它只会删除该文件:

gsutil -m rm gs://mybucket/subbucket/* 2> temp
if [ $? == 1 ]; then
    grep 'One or more URLs matched no objects' temp
    if [ $? == 0 ]; then
        echo "no such file"
    else
        echo temp
    fi
fi
rm temp
Run Code Online (Sandbox Code Playgroud)

这会将 stderr 通过管道传输到临时文件,并检查消息以决定是否忽略它或显示它。

它也适用于单个文件删除。我希望它有帮助。

参考文献:

如何 grep 标准错误流
Bash 参考手册 - 重定向