Aws-cli: aws s3 同步不会在本地同步 s3 文件夹结构

创建于 2014-09-12  ·  100评论  ·  资料来源: aws/aws-cli

即使我将其与 --delete 或 --recursive 参数一起使用,aws s3 同步也不会在本地完全同步 S3 文件夹结构:

aws --version
aws-cli / 1.4.3 Python / 2.7.6 Linux / 3.13.0-35-generic

$ aws s3 ls s3: //s3.testbucket
$ aws s3 ls s3: //s3.testbucket/
$ mkdir s3.testfolder
$ mkdir s3.testfolder / test1
$ aws s3 同步 ./s3.testfolder s3: //s3.testbucket/
$ aws s3 ls s3: //s3.testbucket/
$ touch s3.testfolder / test1 / 1
$ aws s3 同步 ./s3.testfolder/ s3: //s3.testbucket/
上传:s3.testfolder/test1/1 到 s3://s3.testbucket/test1/1
$ aws s3 同步 ./s3.testfolder s3: //s3.testbucket/
$ mkdir ./s3.testfolder/test-to-delete
$ aws s3 同步 s3://s3.testbucket/ ./s3.testfolder/ --delete --recursive
$ aws s3 同步 s3: //s3.testbucket/ ./s3.testfolder/ --delete
$ ls -lah ./s3.testfolder/
总共 60K
drwxrwxr-x 4 tobi tobi 4.0K szept 12 15:24。
drwx ------ 71 tobi tobi 44K szept 12 15:22 ..
drwxrwxr-x 2 tobi tobi 4.0K szept 12 15:23 test1
drwxrwxr-x 2 tobi tobi 4.0K szept 12 15:24 测试删除

$ aws s3 ls s3: //s3.testbucket/
预测试1 /

feature-request s3 s3sync

最有用的评论

根据社区反馈,我们决定将功能请求返回到 GitHub 问题。

所有100条评论

这种行为是众所周知的。 sync命令以这种方式运行的原因是 s3 不实际使用目录。 只有桶和对象。 对象具有类似于目录的前缀,但 s3 并未将特定的物理对象指定为目录。

因此,当同步发生时,由于 s3 没有物理目录,因此只有文件传输到 s3。 因此,当您尝试同步空目录时,不会上传任何内容,因为其中没有文件。 将项目放入目录后,文件(带有代表目录的前缀)将被上传。

谢谢凯尔,很清楚。 我知道 S3 如何存储文件,但有时我们需要在几个地方使用相同的目录结构,即使有空的,或者如果我们不再需要就删除。
一个很好的例子,如果你有复杂的目录结构,本地有很多内容而不是同步到 S3。 之后,自动机制会定期将此结构同步到多个正在运行的实例。 您保持最新(删除)S3 中的大部分内容,然后自动重新同步到您之前使用过的地方。 不幸的是,您会发现原始的复杂目录结构永远保留在同步目标上,如果您想检查它或您的程序尝试使用这个空文件夹,这可能会导致混淆,因为您需要在任何地方始终相同。 此外,使用 --delete 选项使用它的人可能之前在 Linux 上使用了“rsync”等价物,它可以保持文件夹同步,因此依赖于相同的操作。
我认为实现 aws 工具的开关或选项以某种方式检测 S3 对象是否是文件或文件夹(列表、大小等)并在本地或 S3 存储桶中创建/删除它们并不难(例如列表(bucket.list(“”,“/”))?

那讲得通。 将考虑为它添加一个功能。

这对我们的情况也非常有用。 如果将其添加为选项(--sync-empty-directories),人们可以在需要时选择使用它。

+1 非常需要这个功能

+1。 想用它。

+1

我也对这种行为感到惊讶,因为它被称为“同步”。
我可以在我的特定用例中解决这个问题,但未来的用户可以免于痛苦:)

+1 能够同步目录结构! 如果您删除文件夹,它只会删除内容,但会将文件夹留在后面......

+1。 我也有同样的需求。

+1 - 令人惊讶的是尚未实施。 当然,在我的情况下它并不重要,我可以解决它(或者在创建结构时只使用占位符文件),但是让 s3 sync 或 s3 cp 支持它会很有好处。

+1

s3cmd sync确实保留了文件夹结构,但因此在同步时授予访问权限时存在一些问题,因此需要在之后运行另一个s3cmd setacl --recursive ...

+1

+1

+1

感谢大家的反馈。 我认为我见过的最好的选择是添加一个--sync-empty-directories选项。 让我们这样做。

@jamesls我期待有点像 rsync 功能,但 s3 作为对象存储绝对不一样。

+1

+1

此功能的任何时间表?

作为临时解决方法,我向空目录添加了一个空的 .s3keep 文件,它对我有用。 这是我通常用来欺骗 git 不将空目录视为空目录的 hack :)

这是否也允许在 S3 上“删除/删除”空目录?

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

_在数据迁移到 s3 期间很有意义。_

+1

+1 刚刚被这个搞砸了... Arg ....

+1

+10
可以使用虚拟文件解决此问题,但如果有一个选项可以强制使用空前缀进行同步,则会更清晰。

+1。 用例:备份 svn 存储库。

更普遍:
aws s3 同步的东西
aws s3 同步thing_copy

我希望 thing_copy 与事物完全匹配。

+1

+1

+1

+1 需要删除空目录

添加此选项--sync-empty-directories的进度如何?
AWS 团队的任何反馈?
谢谢。

+1 将是一个非常有用的工具的非常有用的功能

+1

+1(我也希望实现此功能,并希望 Github.com 有一个类似于 StackOverflow.com 的界面,用于对问题/功能进行“投票”)。

+1

+1

+1

+1

+1

2 年多后,它仍然没有发生..? 它会永远吗? =/

+1

+1

+1

+1

+1000

+1

我对如何实现这一点进行了一些挖掘。 所有 s3 命​​令最终都使用s3transfer库中的TransferManager 。 (参考这里

为了支持使用 PutObject 添加文件夹,我们可以在 Body 参数中发送一个空字符串。 我不知道这是否得到官方支持。 我在这里实现了这个:
https://github.com/svleeuwen/s3transfer/commit/b7d3745a995a75c5262950bb798c8c57e481c2b3

在继续之前,我想从维护者那里得到一些反馈。

+1

我的解决方案是使用 s3fs 和 rsync 将我的存储桶从 s3 挂载到我的主目录中的目录。

+1

+1 真的需要这个...

+1

从 2014 年开始营业? 真的吗? :无趣:

+1

+1

+1

+1

+1

+1

+1

+1

+1

@thenetimp此解决方案适用于

+1

早上好!

我们将在 GitHub 上关闭此问题,作为我们迁移到UserVoice以处理涉及 AWS CLI 的功能请求的一部分。

这将使我们能够为您提供最重要的功能,让您更轻松地搜索和显示对您最关心的功能的支持,而不会因错误报告而淡化对话。

作为 UserVoice 的快速入门(如果还不熟悉的话):发布想法后,人们可以对想法进行投票,产品团队将直接对最受欢迎的建议做出回应。

我们已经从 GitHub 导入了现有的功能请求 - 在那里搜索这个问题!

别担心,为了后代,这个问题仍然存在于 GitHub 上。 由于它是将原始帖子仅以文本形式导入 UserVoice,因此我们仍会牢记 GitHub 问题上已经存在的评论和讨论。

GitHub 将继续作为报告错误的渠道。

再次,现在可以通过在以下位置搜索标题找到此问题: https :

-AWS 开发工具包和工具团队

此条目可以在 UserVoice 上特别找到: https :

干得好安德烈,关闭一个问题并给我们一个与该问题无关的链接。 在所有无用的帖子中

通用样板令人失望。 我认为功能请求和错误报告之间的界限可能非常模糊。 为了节省一些人搜索 UserVoice 帖子以获取此功能请求,请访问https://aws.uservoice.com/forums/598381-aws-command-line-interface/suggestions/33168436-aws-s3-sync-does-not -synchronize-s3-folder-structu

根据社区反馈,我们决定将功能请求返回到 GitHub 问题。

+1

+1

+1

+1

+1

+1

+1。 添加一个不错的功能。

+1

+1

同样的问题
awscli==1.16.74

+1

-1

aws s3 同步命令已经是递归的,所以不需要递归选项,此外同步命令只复制目标上不存在的东西。 如果您指向一个文件夹,它将递归同步目标目的地上尚不存在的所有内容。 这与 aws s3 cp 命令不同。 cp 命令复制你告诉它的任何内容,不管它是否已经存在于目标上。 cp/ mv/ rb 命令采用 --recursive 选项来递归复制/移动/删除文件夹/文件。 谢谢

@3ggaurav这个问题最初来自 2014 年,当时我记得sync有一个--recursive选项。

此外,如果您要逐字引用堆栈溢出答案,通常最好参考/给予信用。

堆栈溢出答案在这里。

在这方面仍然没有进展吗?

+1

此页面是否有帮助?
0 / 5 - 0 等级