Amazon s3 amazon s3重命名和覆盖文件、建议和风险

Amazon s3 amazon s3重命名和覆盖文件、建议和风险,amazon-s3,batch-rename,Amazon S3,Batch Rename,我有一个桶,里面有两种文件名: [Bucket]/[file] [Bucket]/[folder]/[file] 例如,我可以: MyBucket/bar MyBucket/foo/bar 我想将所有[Bucket]/[folder]/[file]文件重命名为[Bucket]/[file]文件(从而覆盖/丢弃[Bucket]/[file]文件)。 因此,与前面的示例一样,我希望MyBucket/foo/bar变成MyBucket/bar(并覆盖/duscard原始的MyBucket/bar) 我

我有一个桶,里面有两种文件名:

  • [Bucket]/[file]
  • [Bucket]/[folder]/[file]
  • 例如,我可以:

  • MyBucket/bar
  • MyBucket/foo/bar
  • 我想将所有
    [Bucket]/[folder]/[file]
    文件重命名为
    [Bucket]/[file]
    文件(从而覆盖/丢弃
    [Bucket]/[file]
    文件)。
    因此,与前面的示例一样,我希望
    MyBucket/foo/bar
    变成
    MyBucket/bar
    (并覆盖/duscard原始的
    MyBucket/bar

    我尝试了两种方法:

  • 使用s3cmd的move命令:
    s3cmd mv s3://MyBucket/foo/bar s3://MyBucket/bar
  • 使用Amazon的SDK for php:
    重命名(s3://MyBucket/foo/bar,s3://MyBucket/bar)
  • 这两种方法似乎都有效,但考虑到我必须对数千个文件进行批处理,
    我的问题是:

  • 首选哪种方法
  • 还有其他更好的方法吗
  • 我必须在移动/重命名之前删除旧文件吗?(没有它似乎可以正常工作,但我可能没有意识到其中的风险)

  • 谢谢。

    由于s3cmd和SDK这两种方法实际上都会发出相同的REST调用,因此您可以安全地选择最适合您的方法


    当您移动文件时,如果目标文件存在,则始终会被替换,然后,如果您不希望出现这种行为,则需要检查目标文件名是否已存在,以便执行移动操作。

    因为我大约5个月前问过这个问题,所以我有一些时间获得一些见解;因此,我会亲自回答:

    据我所见,在性能方面没有重大差异。我可以想象,从PHP内部调用
    s3cmd
    可能代价高昂,因为每个请求都要调用一个外部进程;但是再一次——亚马逊的SDK使用cURL发送请求,所以没有太大区别

    我注意到的一个不同点是,Amazon的SDK倾向于抛出cURL异常(似乎是随机的,而且很少),但是
    s3cmd
    根本没有崩溃。我的脚本运行在10个成千上万的文件上,因此我必须学习如何处理这些cURL异常。
    我的理论是,当服务器上存在通信冲突时(例如,当两个进程试图使用相同的资源时),cURL崩溃。我在一个开发服务器上工作,有时几个进程同时使用cURL访问S3;这些是cURL表现出这种行为的唯一情况

    结论:

    使用
    s3cmd
    可能会更稳定,但使用SDK可以实现更多功能,更好地与PHP代码集成;只要您记得处理SDK抛出cURL异常的罕见情况(我认为每1000个请求中就有一个请求,当多个进程同时运行时)。

    Hello!我还试图在单个bucket中移动和覆盖文件夹(及其驻留的文件),我注意到您有:rename(s3://MyBucket/foo/bar,s3://MyBucket/bar)。这在PHP中是如何工作的?或者这句话只是在EC2上一字不差地起作用吗?@AndyBarlow,我在:。如果您有更多问题,请与我联系。