Gsutil - 如何使用Gsutil检查GCS存储桶(子目录)中的文件是否存在

25

我有一个GCS存储桶,其中包含路径下的一些文件

gs://main-bucket/sub-directory-bucket/object1.gz

我想通过编程方式检查子目录存储桶是否包含特定文件。我想使用gsutil来完成此操作。

如何实现?

6个回答

14

如果你的脚本允许非零退出码,则:

#!/bin/bash

file_path=gs://main-bucket/sub-directory-bucket/object1.gz
gsutil -q stat $file_path
status=$?

if [[ $status == 0 ]]; then
  echo "File exists"
else
  echo "File does not exist"
fi

但如果你的脚本设置为在错误时失败,那么你就不能使用退出代码。这里有一种替代方案:

#!/bin/bash
trap 'exit' ERR

file_path=gs://main-bucket/sub-directory-bucket/object1.gz
result=$(gsutil -q stat $file_path || echo 1)
if [[ $result != 1 ]]; then
  echo "File exists"
else
  echo "File does not exist"
fi


这应该是正确的答案,因为它也解释了退出代码的情况。 - Jasveer Singh
你可以使用类似于 if [ "$(gsutil -q stat $file_path ; echo $?)" = 0 ] 的语句,而不是设置陷阱。 - bfontaine

12

1
谢谢jterrace。我确实查看了gsutil stat - 特别是gsutil -q stat选项。它看起来非常适合我的用例。然而,Google说我们只能在主目录中使用gsutil -q stat来处理对象。也就是说,它无法处理子目录中包含的对象。是否有其他方法可以检查子目录中的对象是否存在?谢谢! - activelearner
1
子目录实际上并不存在。请参阅 https://cloud.google.com/storage/docs/gsutil/addlhelp/HowSubdirectoriesWork - rein
@activelearner - 这里特指目录本身,而不是其中的对象,例如 gsutil stat gs://bucket/dir/subdir/foo.txt 就可以正常工作。我会提交一个错误报告,以便更新文档并使其更加清晰明了。 - jterrace

11
使用gsutil stat命令。对于访问具有更多文件的子目录,使用通配符(*)。

例如:

gsutil -q stat gs://some-bucket/some-subdir/*; echo $?

就您的情况而言:

gsutil -q stat gs://main-bucket/sub-directory-bucket/*; echo $?

结果0表示存在1表示不存在


3

1

只需使用ls命令并计算输出行数即可。

如果为0,则文件不存在,如果为1,则文件存在。

file_exists=$(gsutil ls gs://my_bucket/object1.gz | wc -l)

当然,同样的方法可以用于许多文件。

files_number=$(gsutil ls gs://my_bucket/object* | wc -l)

这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - Justin Liu

0
如果出于某种原因,您想根据该列表的结果执行某些操作(例如,如果目录中有Parquet文件,则加载BQ表): < p > < code > gsutil -q stat gs://dir/*.parquet; if [ $? == 0 ]; then bq load ... ; fi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接