【问题标题】:How to delete multiple files in S3 bucket with AWS CLI如何使用 AWS CLI 删除 S3 存储桶中的多个文件
【发布时间】:2017-06-03 15:38:50
【问题描述】:

假设我有一个名为 x.y.z 的 S3 存储桶

在这个存储桶中,我有数百个文件。但我只想删除 2 个名为 purple.gifworksheet.xlsx 的文件

我可以通过 AWS 命令​​行工具通过一次调用 rm 来执行此操作吗?

这不起作用:

$ aws s3 rm s3://x.y.z/worksheet.xlsx s3://x.y.z/purple.gif
Unknown options: s3://x.y.z/purple.gif

manual 看来,您似乎无法按名称显式删除文件列表。有谁知道一种方法吗?我不喜欢使用--recursive 标志。

【问题讨论】:

    标签: amazon-web-services amazon-s3 aws-cli


    【解决方案1】:

    您可以通过多次提供--exclude--include 参数来做到这一点。但是,您必须使用 --recursive 才能使其正常工作。

    当有多个过滤器时,请记住过滤器参数的顺序很重要。规则是命令后面出现的过滤器优先于命令前面出现的过滤器。

    aws s3 rm s3://x.y.z/ --recursive --exclude "*" --include "purple.gif" --include "worksheet.xlsx"
    

    这里,除了 purple.gifworksheet.xlsx 之外的所有文件都将从命令中排除。

    如果您不确定,请始终先尝试--dryrun,然后检查哪些文件将被删除。

    来源:Use of Exclude and Include Filters

    【讨论】:

    • 请注意,这也会删除与 --include 模式匹配的子文件夹中的所有文件
    • 虽然这可能不是原始提问者的最佳答案,但我很确定在搜索“如何从存储桶中删除多个文件指定模式”。谢谢!但我确实觉得它有点吓人,我建议添加一个尝试使用“--dryrun”参数的建议。
    • 完成这项工作所需的所有参数中的逻辑是否真的“递归地包含此文件夹中的所有内容”、“排除所有内容”、“包含我的选择”?是我还是这三重重复? (顺便说一句:这是 AWS CLI 的 documented solution。)
    • 是的。使用像aws s3 rm s3:///test-folder/ --include "*.txt" 这样的逻辑(对我来说)来删除这个目录中的所有文本文件什么也没做。然后aws s3 rm s3:///test-folder/ --recursive --include "*.txt" 实际上擦除了/test-folder/ 中的所有文件和子目录!你会认为它只需要 .txt 文件......嗯。 +1 --dry-run
    【解决方案2】:

    s3 rm不能删除多个文件,但是你可以在这里使用s3api delete-objects实现你想要的。

    示例

    aws s3api delete-objects --bucket x.y.z --delete '{"Objects":[{"Key":"worksheet.xlsx"},{"Key":"purple.gif"}]}'
    

    【讨论】:

    • 这行得通,但答案的“你不能使用s3 rm”部分是不正确的
    【解决方案3】:

    显然 aws s3 rm 仅适用于单个文件/对象。

    下面是一个 bash 命令,它构造单个删除命令,然后一个一个地删除对象。取得了一些成功(可能有点慢,但有效):

    aws s3 ls s3://bucketname/foldername/ | 
    awk {'print "aws s3 rm s3://bucketname/foldername/" $4'} | 
    bash
    

    前两行用于构造“rm”命令,第三行 (bash) 将执行它们。

    请注意,如果您的对象名称包含空格或有趣的字符,您可能会遇到问题。这是因为“aws s3 ls”命令不会列出此类对象(在撰写本文时)

    【讨论】:

    • 也许不是选美比赛的获胜者,但是嘿 - 如果您不直接使用 bash,它可以让您有机会查看您的“删除计划”。谢谢!
    【解决方案4】:

    此命令删除存储桶中的文件。
    aws s3 rm s3://buketname --recursive

    【讨论】:

    • 它会删除哪些文件?你能举一个只删除两个文件的例子吗?
    【解决方案5】:

    如果您使用 AWS CLI,您可以使用 grep regex 过滤 LS 结果并将其删除。例如

    aws s3 ls s3://BUCKET | awk '{print $4}' | grep -E -i '^2015-([0-9][0-9])\-([0-9][0-9])\-([0-9][0-9])\-([0-9][0-9])\-([0-9][0-9])\-([0-9a-zA-Z]*)' | xargs -I% bash -c 'aws s3 rm s3://BUCKET/%'

    这很慢,但很有效

    【讨论】:

      【解决方案6】:

      当您想为对象名称指定通配符时,此解决方案将起作用。

      aws s3 ls dmap-live-dwh-files/backup/mongodb/oms_api/hourly/ | grep order_2019_08_09_* | awk {'print "aws s3 rm s3://dmap-live-dwh-files/backup/mongodb/oms_api/hourly/" $4'} | bash 
      

      【讨论】:

      • aws s3 ls --recursive BUCKET_NAME | grep PATTERN_TO_DELETE | awk '{print "aws s3 rm s3://BUCKET_NAME/" $4}' | bash 你可以在删除之前测试删除| bash
      【解决方案7】:

      我发现这个通过命令行很有用。我有超过 400 万个文件,我花了将近一周的时间才清空存储桶。这很方便,因为 AWS 控制台没有描述日志。

      注意:您需要安装jq 工具。

       aws s3api list-object-versions --bucket YOURBUCKETNAMEHERE-processed \
           --output json --query 'Versions[].[Key, VersionId]' \
           | jq -r '.[] | "--key '\''" + .[0] + "'\'' --version-id " + .[1]' \
           | xargs -L1 aws s3api delete-object --bucket YOURBUCKETNAMEHERE
      

      【讨论】:

      • 嗯,我想你的意思是jq,而不是jQuery
      【解决方案8】:

      在 AWS 中删除一个非常大的文件夹的快速方法

      AWS_PROFILE=<AWS_PROFILE> AWS_BUCKET=<AWS_BUCKET> AWS_FOLDER=<AWS_FOLDER>; aws --profile $AWS_PROFILE s3 ls "s3://${AWS_BUCKET}/${AWS_FOLDER}/" | awk '{print $4}' | xargs -P8 -n1000 bash -c 'aws --profile '${AWS_PROFILE}' s3api delete-objects --bucket '${AWS_BUCKET}' --delete "Objects=[$(printf "{Key='${AWS_FOLDER}'/%s}," "$@")],Quiet=true" >/dev/null 2>&1'
      

      PS:这可能会启动 2/3 次,因为有时,某些删除失败...

      【讨论】:

        【解决方案9】:

        可以使用aws s3 rm 删除多个文件。如果要删除特定文件夹中的所有文件,只需使用

        aws s3 rm --recursive --region &lt;AWS_REGION&gt; s3://&lt;AWS_BUCKET&gt;/&lt;FOLDER_PATH&gt;/

        首先使用--dryrun 选项对其进行测试!

        【讨论】:

          猜你喜欢
          • 2017-08-24
          • 2015-06-30
          • 1970-01-01
          • 2016-12-14
          • 2020-07-14
          • 2017-04-25
          • 2020-05-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多