如何检索云存储桶中的最新文件?

Posted

技术标签:

【中文标题】如何检索云存储桶中的最新文件?【英文标题】:How to retrieve the most recent file in cloud storage bucket? 【发布时间】:2018-01-27 09:12:05 【问题描述】:

这可以用 gsutil 完成吗?

https://cloud.google.com/storage/docs/gsutil/commands/ls 似乎没有提及任何排序功能 - 仅按日期过滤 - 这不适用于我的用例。

【问题讨论】:

Google Cloud Storage: How to get list of new files in bucket/folder using gsutil的可能重复 那是要求在某个日期之前选择。这似乎是过滤功能。 按日期过滤在哪里? 【参考方案1】:

您好,这似乎仍然不存在,但这篇文章中有一个解决方案:enter link description here

使用的命令是这个:

gsutil ls -l gs://[bucket-name]/ | sort -k 2

由于它允许您按日期过滤,因此您可以获得存储桶中的最新结果,并在需要时使用另一个管道恢复最后一行。

【讨论】:

【参考方案2】:
gsutil ls -l gs://<bucket-name> | sort -k 2 | tail -n 2 | head -1 | cut -d ' ' -f 7

如果桶中的对象少于两个,它将无法正常工作

【讨论】:

【参考方案3】:

通过在主机上使用gsutil,这将填充响应数组:

response=(`gsutil ls -l gs://some-bucket-name|sort -k 2|tail -2|head -1`)

或者来自 docker 容器的 gsutil

response=(`docker run --name some-container-name --rm --volumes-from gcloud-config -it google/cloud-sdk:latest gsutil ls -l gs://some-bucket-name|sort -k 2|tail -2|head -1`)

然后,要获得整个响应,请运行:

echo $response[@]

将打印例如:

33 2021-08-11T09:24:55Z gs://some-bucket-name/filename-37.txt

或者从响应中获取单独的信息,(例如文件名)

echo $response[2]

只打印文件名

gs://some-bucket-name/filename-37.txt

【讨论】:

【参考方案4】:

对于我的用例,我想在我的存储桶中找到最新的目录。我按升序对它们进行编号(前导零),所以我需要得到最新的就是这样:

gsutil ls -l gs://[bucket-name] | sort | tail -n 1 | cut -d '/' -f 4
    列出目录 按字母顺序排序(可能没有必要) 取最后一行 使用“/”分隔符对其进行标记 获取第四个token,即目录名

【讨论】:

阅读此链接以了解顺序命名对象:cloud.google.com/storage/docs/best-practices#naming 如果您要并行上传许多对象,请避免使用顺序对象名称,例如基于时间戳的对象名称。具有顺序名称的对象是连续存储的,因此它们很可能会命中同一个后端服务器。发生这种情况时,吞吐量会受到限制。为了达到最佳吞吐量,将序列号的哈希添加为对象名称的一部分,使其不连续。 我多年来一直这样做,没有任何问题...我有根文件夹 0001 0002 0003 0004 等;每个限制为 75GB;当它填满时,我继续下一个。文件夹中的文件名是文件内容的 md5 哈希值,所以可能适合上面的措辞? 云存储没有文件夹。您认为文件夹只是作为对象名称一部分的前缀。桶是一个平面命名空间。除非您需要最佳性能,否则这对您来说可能无关紧要。对于需要数百万/数十亿对象的高性能的客户:具有顺序名称的对象是连续存储的,因此它们很可能会访问同一个后端服务器。我对您的回答发表了评论,以便其他人在不了解对性能的影响的情况下不要复制您的命名方案。 我知道,但我将其用作服务器的备份。我应该澄清一下,我的意思是我在服务器上的文件结构。 我不是想通知你。我为您的答案的未来读者发表评论。

以上是关于如何检索云存储桶中的最新文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Spark 中的多个云存储桶中读取 TXT 文件?

将文件上传到 Firebase 云存储时出错:“rules_version = 1 不允许列出存储桶中的对象”

对存储桶中的文件更改调用应用程序 API

训练对象检测模型时是不是需要将图像和注释复制到云存储桶中?

如何获取或生成存储桶中对象的 URL?

如何在谷歌存储桶中列出所有上传到存储桶的文件?