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

时间:2017-03-21 16:18:34

标签: gsutil

我正在运行以下命令,以便在加载新文件之前从gcs存储桶中删除文件。

gsutil ls gs://mybucket/subbucket/*

如果存储桶中没有文件,则会抛出" CommandException:一个或多个URL没有匹配对象"。

我希望删除文件,如果存在而不抛出错误。

tf.train.Saver()

出现同样的错误

如何在不必明确处理异常的情况下重写此内容?或者,如何在批处理脚本中最好地处理这些异常?

3 个答案:

答案 0 :(得分:6)

试试这个:

gsutil -m rm gs://mybucket/foo/* 2> /dev/null || true

或者:

gsutil -m ls gs://mybucket/foo/* 2> /dev/null || true

这具有抑制stderr(它被定向到/dev/null)的效果,并且即使失败也会返回成功错误代码。

答案 1 :(得分:0)

您可能不想忽略所有错误,因为它可能表示找不到该文件的某些内容。使用以下脚本,您只会忽略一个或多个匹配不是对象的网址'但会告诉你一个不同的错误。如果没有错误,它只会删除文件:

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

这会将stderr传递给临时文件,并会检查消息以决定是忽略它还是显示它。

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

参考文献:

How to grep standard error stream
Bash Reference Manual - Redirections

答案 2 :(得分:0)

您可能希望rsync将文件和文件夹同步到存储桶。我用它来清除存储桶中的文件夹并将其替换为构建脚本中的新文件。

gsutil rsync -d newdata gs://mybucket/data-用新数据替换data文件夹