【问题标题】:Why does s3cmd du give different results depending on slash at end of path?为什么 s3cmd du 根据路径末尾的斜杠给出不同的结果?
【发布时间】:2015-05-18 15:23:56
【问题描述】:
s3cmd du -H s3://bucketabc/prefix/further-prefix

给21G

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

提供 10G。

里面没有直接的文件,只有四个“子目录”。

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

存储桶和看似无关的存储桶之间唯一明显的区别是,带或不带斜线的两个提供 10G 的子目录比其他的有一个 more 子目录,只有一个 138M文件。

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

【问题讨论】:

  • s3cmd 是一个过时的程序,但是如果添加--verbose,它会给出什么?它列出文件吗? (如果是,请在此处粘贴行)
  • 带有斜线的那个返回more?
  • @Michael-sqlbot 好点,带斜线的返回更少(10G)
  • @tedder42 s3cmd 有什么替代品?
  • @tedder42 du -H --verbose 生成与没有 --verbose 相同的输出(无附加信息)

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


【解决方案1】:

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

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

也许不太直观的是,请求foo 确实是在请求foo*,其中包括foo*/*

这是一个 前缀 匹配。任何具有匹配前缀的键都将被包括在内,因此前缀foo 不仅包括foo/*,还包括foobar/* 等。

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

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

如果没有尾部斜线,我怀疑由于前缀匹配范式,您匹配的次数比预期的要多。

【讨论】:

  • 是的,就是这样。还有其他一些我之前没有注意到的“目录”,它们只在这两个存储桶中。我知道 AWS “目录”并不是真正的目录,但发现某些功能将斜杠视为特殊分隔符。无论如何,你明白了。
  • 是的,/ 通常被视为路径分隔符,但在 API 级别,您必须指定它,才能发生这种情况......如果使用它,您只能获取内容恰好一个“目录”关闭,并且您必须不断重复,关闭,关闭,发送额外的请求,损害性能并增加潜在的大量请求的成本。
猜你喜欢
  • 1970-01-01
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 2010-11-30
  • 2015-08-26
  • 2016-12-12
  • 1970-01-01
  • 2020-08-08
相关资源
最近更新 更多