为什么 s3cmd du 根据路径末尾的斜杠给出不同的结果?

Why does s3cmd du give different results depending on slash at end of path?

s3cmd du -H s3://bucketabc/prefix/further-prefix

给21G

s3cmd du -H s3://bucketabc/prefix/further-prefix/

给10G。

里面没有直接的文件,只有四个"subdirectories."

我有五个接近副本的存储桶,这只发生在其中两个存储桶中。其他的一直显示10G。

桶之间唯一明显的区别—​​—和一个看似无关的桶——是两个提供 10G 的带或不带斜杠的子目录比其他的多 个子目录, 里面有一个138M的文件。

为什么是 21G 与 10G?哪个是正确答案?

在 S3 REST API 中,当遍历对象时,您通常会指定一个键前缀,它是一个左锚定子字符串,匹配您要返回的所有键值。

当你告诉S3你想要foo/的时候,你所要求的当然是foo/*

也许不那么直观的是,要求 foo 实际上是要求 foo*,其中包括 foo*/*

这是 前缀 匹配。将包含任何具有匹配前缀的键,因此前缀 foo 不仅会包含 foo/*,还会包含 foobar/*,等等

这就是为什么我们中的一些人似乎如此喜欢发出友好的提醒 "S3 is not a filesystem, it is an object store," 即使在某种程度上,您已经知道这一点。它并不完全遵循文件系统语义。我认为,这是有时看似微妙的区别很重要的原因之一。

与文件系统不同,S3 中的目录层次结构并不存在。这是基于 / 字符的方便错觉。您可以在控制台中创建的文件夹同样是一种幻觉——它们是控制台允许您添加的空对象,以便在您在存储桶中实际拥有任何具有该前缀的键之前创建层次结构的外观。因此,没有对象实际上是 "in" 个文件夹的概念,它们只是 "under" 个文件夹。

如果没有尾部斜杠,我怀疑您匹配的比预期的要多,因为前缀匹配范例。