我想务实地检查对象谷歌云存储桶中是否存在对象。基于对象可用性,我将执行进一步的操作。
我已经完成https://cloud.google.com/storage/docs/gsutil/commands/stat并且doc提到" gsutil -q "对于编写脚本很有用,因为现有对象的退出状态为0,不存在的对象的退出状态为1。但是当我使用命令时,它无法正常工作。如果有人试过这个,请告诉我吗?
#!/bin/bash
gsutil -q stat gs://<bucketname>/object
return_value=$?
if [ $return_value != 0 ]; then
echo "folder exist"
else
echo "folder does not exist"
fi
答案 0 :(得分:2)
您已反转条件检查:退出状态0表示成功,即gsutil stat命令找到给定对象。
答案 1 :(得分:1)
我发现您已经找到了问题的答案,但是,我将在此处发布此答案,以便提供有关gsutil stat
命令如何工作以及您的代码无法正常工作的更多背景信息。
gsutil是一个Python应用程序,用于使用命令行界面访问和使用云存储。它有许多可用的命令,您使用的命令是gsutil stat,它输出检索最小可能数据的对象的元数据,而不必列出存储桶中的所有对象。此命令也是strongly consistent,这使其成为某些类型应用程序的合适解决方案。
使用gsutil stat gs://<BUCKET_NAME>/<BUCKET_OBJECT>
命令返回如下内容:
gs://<BUCKET_NAME>/<BUCKET_OBJECT>.png:
Creation time: Tue, 06 Feb 2018 14:49:58 GMT
Update time: Tue, 06 Feb 2018 14:49:58 GMT
Storage class: MULTI_REGIONAL
Content-Length: 6119
Content-Type: image/png
Hash (crc32c): <CRC32C_HASH>
Hash (md5): <MD5_HASH>
ETag: <ETAG>
Generation: <TIMESTAMP>
Metageneration: 1
但是,如果使用-q
运行它,如果对象存在则返回0
,如果不存在则返回1
,这使编写脚本(如你分享的一个。
最后,在使用存储桶中的子目录时,您还需要考虑一些其他注意事项:
gsutil -q stat gs://my_bucket/my_subdirectory
之类的命令将检索名为my_subdirectory
的对象的数据,而不是目录本身的数据。gsutil -q stat gs://my_bucket/my_subdirectory/
之类的命令将在子目录本身上运行,而不是在嵌套文件上运行,因此它只会告诉您子目录是否存在(这就是您的代码失败的原因< /强>)。gsutil -q stat gs://my_bucket/my_subdirectory/my_nested_file.txt
之类的内容来检索嵌套在子目录下的文件的元数据。因此,简而言之,您的问题是您没有对路径做出正确的定义。并不是gsutil
在理解路径时过于敏感,但这种行为是按预期工作的,因为您可能遇到以下情况:您有一个文件和一个同名文件夹,并且您应该能够检索它们中的任何一个,因此需要指定/
来指示它是目录还是文件:
gs://my_bucket/
|_ my_subdirectory #This is a file
|_ my_subdirectory/ #This is a folder
|_ my_nested_file.txt #This is a nested file
答案 2 :(得分:0)
问题是我们应该使用/ after对象来确保gsutil -q stat命令正确识别路径。如果我删除/然后它不起作用。如果谷歌对理解路径如此敏感,我会感到惊讶。
#!/bin/bash
gsutil -q stat gs://<bucketname>/object/
return_value=$?
if [ $return_value = 0 ]; then
echo "folder exist"
else
echo "folder does not exist"
fi