使用AWS CLI在S3存储桶中下载最新文件?

Abe*_*ler 24 amazon-s3 amazon-web-services aws-cli

我有一个包含数据库备份的S3存储桶.我正在创建一个脚本,我想下载最新的备份(并最终将其恢复到其他地方),但我不知道如何只从桶中抓取最新的文件.

是否可以使用AWS CLI工具仅将最新文件从s3存储桶复制到本地目录?

err*_*07s 41

这是您可以采取的方法.

您可以列出存储桶中的所有对象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
Run Code Online (Sandbox Code Playgroud)

它们按键按字母顺序排序,但第一列是最后修改的时间.快速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
Run Code Online (Sandbox Code Playgroud)

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

$ aws s3 ls $BUCKET --recursive | sort | tail -n 1 | awk '{print $4}'
some/other/object
Run Code Online (Sandbox Code Playgroud)

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

$ KEY=`aws s3 ls $BUCKET --recursive | sort | tail -n 1 | awk '{print $4}'`
$ aws s3 cp s3://$BUCKET/$KEY ./latest-object
Run Code Online (Sandbox Code Playgroud)

  • 您是否复制了[此答案](/sf/answers/2174506491/)?据我所知,您做到了,但您不承认。 (5认同)

小智 8

上述解决方案均使用 Bash。如果想在 Windows 上的PowerShell中执行相同的操作,请使用以下脚本:

# This assumes AWS CLI exe is in your path.
$s3location = "s3://bucket-name"
$files = $(aws s3 ls $s3location --recursive | sort | select -last 3)
$dlPath = "C:\TEMP"

foreach ($s3FileInfo in $files) {
    $filename = $s3FileInfo.Split()[-1]
    $path = "${s3location}/${filename}"
    aws s3 cp $path $dlPath
    echo("Done downloading ${path} to ${dlPath}")
}
Run Code Online (Sandbox Code Playgroud)


JBa*_*zuk 5

这是一个基于@ error2007s答案的bash脚本。此脚本要求将aws配置文件和存储桶名称作为变量,并将最新对象下载到〜/ Downloads文件夹中:

#!/bin/sh
PROFILE=your_profile
BUCKET=your_bucket

OBJECT="$(aws s3 ls --profile $PROFILE $BUCKET --recursive | sort | tail -n 1 | awk '{print $4}')"
aws s3 cp s3://$BUCKET/$OBJECT ~/Downloads/$OBJECT --profile $PROFILE
Run Code Online (Sandbox Code Playgroud)


sur*_*tty 5

FILE=`aws s3api list-objects-v2 --bucket "$BUCKET_NAME" --query 'reverse(sort_by(Contents[?contains(Key, \`$FILE_NAME_FILTER\`)], &LastModified))[:1].Key' --output=text`;aws s3 cp "s3://$BUCKET_NAME/$FILE" .
Run Code Online (Sandbox Code Playgroud)

$BUCKET_NAME - 是您要从中下载的存储桶。

$FILE_NAME_FILTER - 用作名称过滤器的字符串,您要匹配该名称。

aws s3 cp " " - 它用双引号引起来,因为还包括名称中带有空格的文件。