【问题标题】:Moving many files in the same bucket在同一个存储桶中移动多个文件
【发布时间】:2020-12-16 03:56:43
【问题描述】:

我在一个存储桶中有 200k 个文件,我需要将它们移动到同一个存储桶中的子文件夹中,最好的方法是什么?

【问题讨论】:

  • 我的答案是否低于您的要求?

标签: amazon-s3


【解决方案1】:

我最近遇到了同样的问题。我使用命令行 API 解决了它。

http://docs.aws.amazon.com/cli/latest/index.html http://docs.aws.amazon.com/cli/latest/reference/s3/mv.html

aws s3 mv s3://BUCKETNAME/myfolder/photos/ s3://BUCKETNAME/myotherfolder/photos/ --recursive

我需要让对象公开可见,所以我添加了--acl public-read 选项。

【讨论】:

  • IIRC,您需要为 mv 将在后台创建的每个命令副本和删除付费,因为 AWS 没有“移动”命令,aws 脚本会使用副本伪造该命令,然后递归删除每个文件
  • @higuita 据我了解,这是没有办法的。 AWS 不提供移动/重命名。
  • 这节省了我将 700,000 个文件移动到另一个目录的时间!
  • 复制/删除没有问题,因为删除请求是免费的。 PUT、COPY、POST 或 LIST 每 1000 个请求的费用为 0.005 美元(标准)。所以例如移动 700,000 个对象是 3.50 美元(与仅复制它们相同)。
  • 出于安全原因,我已编辑此答案。将--acl public-read 放在主代码体中对于不了解 AWS 或其安全模型并且倾向于快速复制/粘贴和尝试代码而不理解它的人(很多很多人)来说是有问题的。它也没有回答没有提到公共 ACL 的问题,所以我将该选项代码放在评论的末尾。
【解决方案2】:

最近可以用一个命令来做到这一点。也比对每个文件的单独请求快得多。

像这样运行一个 sn-p:

aws s3 mv s3://bucket-name/ s3://bucket-name/subfolder --recursive --exclude "*" --include "*.txt"

使用--include 标志有选择地选择你想要的文件

【讨论】:

  • 你忘记了--recursive 标志
  • 一句警告:这可能会导致在您的存储桶中使用由“深度嵌套”子文件夹组成的键来创建对象,例如s3://bucket-name/subfolder/subfolder/subfolder/blah.txt。通过添加额外的排除来规避此问题:$ aws s3 mv s3://bucket-name/ s3://bucket-name/subfolder --recursive --exclude "" --include "。 txt" --exclude "子文件夹/*"
【解决方案3】:

没有“重命名”操作,但如果有就好了。

相反,您需要遍历要重命名的每个项目,复制到新对象,然后删除旧对象。

注意:为了简单起见,我假设您没有在存储桶上启用版本控制。

【讨论】:

  • 听起来很痛苦! API 似乎是为了赚钱而优化的,而不是为了方便。
【解决方案4】:

我遇到了同样的问题,最终我使用了 aws s3 mv 和一个 bash for 循环。

我做了aws ls bucket_name 来获取存储桶中的所有文件。然后我决定要移动哪些文件并将它们添加到file_names.txt

然后我运行以下 sn-p 来移动所有文件:

for f in $(cat file_names.txt)
do
    aws s3 mv s3://bucket-name/$f s3://bucket-name/subfolder/$f
done

【讨论】:

    【解决方案5】:

    如果您的文件在文件夹中,您可以使用 s3cmd 工具

    s3cmd cp --recursive s3://bucket/folder/ s3://bucket/sub_folder/
    

    Ps:我假设你已经安装并配置了 s3cmd

    【讨论】:

      【解决方案6】:

      以下脚本对我来说非常完美,没有任何问题

      for i in `cat s3folders`
      do 
           aws s3 mv s3://Bucket_Name/"$i"/ s3://Another_Bucket_Name/ --recursive
      done
      

      一旦文件移动到目标,它也会从源中删除空文件夹。

      【讨论】:

      • Another_Bucket_Name 如何满足“同一个桶”的要求? s3folders 是从哪里来的?
      猜你喜欢
      • 1970-01-01
      • 2016-02-10
      • 2020-06-09
      • 1970-01-01
      • 2021-04-09
      • 2013-11-01
      • 2020-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多