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

时间:2016-07-14 21:53:49

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

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

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

4 个答案:

答案 0 :(得分:38)

这是一种你可以采取的方法。

您可以使用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 :(得分:4)

这是一个基于@ 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

答案 2 :(得分:4)

from matplotlib import pyplot as plt
import numpy as np
from scipy.stats import rayleigh

N = 1000
# V = np.random.uniform(0, 0.1, 2*N).reshape((N,2))
# V_norm = (np.linalg.norm(V, axis=1))
scale = 0.08
V_norm_hist = scale * np.sqrt( -2* np.log (np.random.uniform(0, 1, N)))
fig, ax = plt.subplots(1, 1)

num_bins = 60
_binvalues, bins, _patches = plt.hist(V_norm_hist, bins=num_bins, density=False, rwidth=1, ec='white', label='Histogram')
x = np.linspace(bins[0], bins[-1], 100)
binwidth = (bins[-1] - bins[0]) / num_bins

scale = V_norm_hist.mean() / np.sqrt(np.pi / 2)

plt.plot(x, rayleigh(loc=0, scale=scale).pdf(x)*len(V_norm_hist)*binwidth, lw=5, alpha=0.6, label=f'Rayleigh pdf (s={scale:.3f})')
plt.legend()
plt.show()

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

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

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

答案 3 :(得分:0)

如果要使用以下脚本在Windows中进行下载以在Powershell中执行相同的操作,上述解决方案就是Bash:

$s3location = 's3://bucket/'
$filename=C:\Progra~1\Amazon\AWSCLI\aws.exe s3 ls s3://bucket/PROD_FULL/ -- 
recursive | sort |select -last 3 
$Dpath='I:\Data_S3'

foreach($files in $filename)
{
#$files.ToString()
$testpath1 = Split-Path $path -leaf
$testpath1
$path=$s3location+$files

C:\Progra~1\Amazon\AWSCLI\aws.exe s3 cp $path $Dpath
echo(" ***Files Downloaded ***")

}