【问题标题】:Fetch last modified object from AWS S3 CLI从 AWS S3 CLI 获取最后修改的对象
【发布时间】:2020-12-16 16:23:12
【问题描述】:

我正在尝试将基于 Last Modified 的最新文件从 AWS S3 Folder_Test1 文件夹复制到同一存储桶中的 Folder_Test2 文件夹,并在复制命令中使用 exclude 和 include。

Folder_Test1:

Name                               Last Modified
T1_abc_june21.csv                  June 21,2020 9:27:03 AM GMT-0700
T1_abc_june21.csv                  June 21,2020 7:40:15 PM GMT-0700
T1_abc_june21.csv                  June 21,2020 9:20:32 PM GMT-0700
T1_abc_june25.csv                  June 25,2020 10:23:30 PM GMT-0700
T2_abc_june29.csv                  June 29,2020 6:15:12 AM GMT-0700
T2_abc_june29.csv                  June 29,2020 5:12:15 PM GMT-0700 (Fetch this object)
T1_abc_def_june21.csv              June 21,2020 6:13:15 PM GMT-0700
T2_abc_def_june25.csv              June 25,2020 5:33:10 AM GMT-0700
T3_abc_def_june25.csv              June 25,2020 9:31:15 PM GMT-0700 (Fetch this object)

我必须过滤只有abc 最新文件的文件名并排除复制文件:

我试过了: 步骤 1 将 abc 文件从 Folder_Test1 复制到 Folder_Test2:

aws s3 cp  s3://$bucket/Folder_Test1/ s3://$bucket/Folder_Test2/ --recursive --exclude "*abc_def*"

第2步它将从Folder_Test2中获取最新的abc文件:

aws s3 ls  s3://$bucket/Folder_Test2/ --recursive | sort | tail -n 1 | awk '{print $4}'

如何将最新的文件从 Folder_Test2 复制到 Folder_Test3?或如何从 Folder_Test2 中删除除最新文件之外的所有其他文件?

【问题讨论】:

  • 你不能直接从 API 中得到这个,你需要本地的排序/过滤逻辑。

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


【解决方案1】:

您正在扫描多少个文件?

如果它是 100,000 或更多,您可能希望使用比 aws-cli 更快的东西。 S3P 使用并行列表算法将 S3 存储桶列表加速超过 10 倍

您只需要安装NodeJs。然后运行 ​​s3p:

npx s3p map \
  --bucket  my-bucket \
  --prefix  Folder_Test1/ \
  --reduce  "js:(a, b) => a.LastModified > b.lastModified ? a : b" \
  --finally "js:({Key}) => Key"

这将输出Folder_Test1/中最近修改文件的密钥。

更多信息:

免责声明:我编写 S3P 是为了处理非常大的存储桶。

【讨论】:

    【解决方案2】:

    此命令将列出给定前缀的“最新”对象:

    aws s3api list-objects --bucket MY-BUCKET --prefix foo/ --query 'sort_by(Contents, &LastModified)[-1].Key' --output text
    

    您可以将其与复制命令结合使用:

    key=$(aws s3api list-objects --bucket SOURCE-BUCKET --prefix foo/ --query 'sort_by(Contents, &LastModified)[-1].Key' --output text)
    aws s3 cp s3://SOURCE-BUCKET/$key s3://DEST-BUCKET/
    

    --query 参数非常强大。见:JMESPath Tutorial

    但是,list-objects 命令不能与--include/--exclude 组合使用。

    坦率地说,编写一个小的 Python 脚本来实现您的目标可能会更容易。

    【讨论】:

      【解决方案3】:

      我能够让它工作,但它需要一些与 shell 相关的代码和jq。在 Linux 环境中,我能够执行以下操作:

      aws s3 cp s3://$bucket/`aws s3api list-objects-v2 --bucket $bucket --prefix Folder_Test1/ | jq -r '.[] | sort_by(.LastModified)[-1].Key'` $bucket/Folder_Test2/
      

      这是做什么的?第一部分在此示例中查找以“Folder_Test1/”开头的最新文件:

      aws s3api list-objects-v2 --bucket $bucketsource --prefix Folder_Test1/ | jq -r '.[] | sort_by(.LastModified)[-1].Key'
      

      我们将这个输出通过管道传递给jq,让它按 LastModified 字段排序并获取该项目的 Key。请注意,这是使用 s3api 以便我们可以读取原始 JSON。

      一旦我们有了该输出,我们就会将该输出用作cp 命令的输入。

      这是在 Ubuntu 系统上使用 AWS CLI (2.0.30) V2 测试的。 jq 命令已安装。

      【讨论】:

        猜你喜欢
        • 2015-09-12
        • 2020-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-29
        • 1970-01-01
        • 2017-06-27
        • 1970-01-01
        相关资源
        最近更新 更多