从S3 CLI获取最后修改的对象

时间:2015-06-25 23:17:59

标签: amazon-web-services amazon-ec2 amazon-s3

我有一个用例,我以编程方式从S3启动EC2实例,复制和可执行文件,运行它并关闭实例(在用户数据中完成)。我只需要从S3中获取最后添加的文件。有没有办法使用CLI从S3存储桶中获取最后修改的文件/对象?

5 个答案:

答案 0 :(得分:103)

您可以使用aws s3 ls $BUCKET --recursive列出存储桶中的所有对象:

$ aws s3 ls $BUCKET --recursive
2015-05-05 15:36:17          4 an_object.txt
2015-06-08 14:14:44   16322599 some/other/object
2015-04-29 12:09:29      32768 yet-another-object.sh

它们按键按字母顺序排序,但第一列是最后修改的时间。快速sort将按日期重新排序:

$ aws s3 ls $BUCKET --recursive | sort
2015-04-29 12:09:29      32768 yet-another-object.sh
2015-05-05 15:36:17          4 an_object.txt
2015-06-08 14:14:44   16322599 some/other/object

tail -n 1选择最后一行,awk '{print $4}'提取第四列(对象名称)。

$ aws s3 ls $BUCKET --recursive | sort | tail -n 1 | awk '{print $4}'
some/other/object

最后但并非最不重要的是,将其放入aws s3 cp以下载对象:

$ KEY=`aws s3 ls $BUCKET --recursive | sort | tail -n 1 | awk '{print $4}'`
$ aws s3 cp s3://$BUCKET/$KEY ./latest-object

答案 1 :(得分:9)

aws s3api list-objects-v2 --bucket "bucket-name" |jq  -c ".[] | max_by(.LastModified)|.Key"

答案 2 :(得分:4)

此命令无需任何外部依赖即可完成工作:

aws s3api list-objects-v2 --bucket "my-awesome-bucket" --query 'reverse(sort_by(Contents, &LastModified))[:1].Key' --output=text

答案 3 :(得分:2)

以下是bash脚本,从S3 Bucket下载最新文件。我使用AWS S3 同步命令,因此如果已经存在,它将不会从S3下载文件。

- 排除,排除所有文件

- include,包括与模式匹配的所有文件

#include <iostream>

using namespace::std;

void binary(int *);

int main() {
    int input[3];

    cout << "Enter 3 numbers : ";

    for(int i = 0; i < 3; i++ ){
        cin >> input[i];
    }

    binary(input);


    return 0;
}

void binary(int *num){
    int rem = 0;
    for(int i = 0 ;i < 3; i++){

        if (num[i] < 1){
            cout << rem;
            return;
        }

        rem = num[i] % 2;
        binary(*num / 2);

        cout << rem;
    }
}

P.S。谢谢@David Murray

答案 4 :(得分:1)

如果这是新上传的文件,您可以使用Lambda在新的S3对象上执行一段代码。

如果你真的需要获得最新版本,可以先命名文件,按名称排序,然后取第一个对象。