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

时间:2015-05-18 15:23:57

标签: amazon-web-services amazon-s3 s3cmd

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

给出21G

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

给出10G。

那里没有直接的文件,只有四个"子目录。"

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

桶之间唯一明显的区别 - 和一个看似无关紧要的区别 - 是带有或不带斜线的10G有一个更多子目录,只有一个138M在其中存档。

为什么21G vs 10G?这是正确的答案?

1 个答案:

答案 0 :(得分:2)

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

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

可能不太直观的是,要求foo确实要求foo*,其中包括foo*/*

它是前缀匹配。将包含具有匹配前缀的任何密钥,因此前缀foo不仅包括foo/*,还包括foobar/*等。

这就是为什么我们中的一些人似乎非常喜欢发出友好的提醒," S3不是文件系统,它是一个对象存储,"即使在某种程度上,你已经知道了。它并不精确遵循文件系统语义。我认为,这是有时微妙的区别很重要的原因之一。

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

没有尾部斜杠,我怀疑你的匹配超出了你的预期,因为前缀匹配的范例。