即使我将其与 --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 /
这种行为是众所周知的。 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 与事物完全匹配。
+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 选项来递归复制/移动/删除文件夹/文件。 谢谢
在这方面仍然没有进展吗?
+1
最有用的评论
根据社区反馈,我们决定将功能请求返回到 GitHub 问题。