我想从 S3 Spaces 下载最新的 150 个文件。我用了这个命令
s3cmd get s3://obs/site1/uploads/large/ /home/ankit -r | tail -n150
但它没有达到我想要的效果;相反,它开始下载所有文件
例如:如果我命令:
输入
s3cmd ls s3://obs/site1/uploads/large/
输出
2020-04-30 20:04 0 s3://obs/site1/uploads/large/
2020-04-30 20:04 1401551 s3://obs/site1/uploads/large/501587671885rwk.jpg
2020-04-30 20:04 268417 s3://obs/site1/uploads/large/501587676002xe2.jpg
2020-04-30 20:04 268417 s3://obs/site1/uploads/large/501587677157ssj.jpg
2020-04-30 20:04 268417 s3://obs/site1/uploads/large/501587747245hea.jpg
2020-05-01 05:23 399636 s3://obs/site1/uploads/large/87429599_1412258992269430_5992557431891165184_o.jpg
我只想下载最后一个文件(它是最新的):
2020-05-01 05:23 399636 s3://obs/site1/uploads/large/87429599_1412258992269430_5992557431891165184_o.jpg
我可以列出最新文件,但无法下载最新文件:我列出的是:
s3cmd ls s3://obs/site1/uploads/large/ | tail -n1
输出:2020-05-01 05:23 399636
s3://obs/site1/uploads/large/87429599_1412258992269430_5992557431891165184_o.jpg
那么,请告诉我只下载这个最新文件的命令?
答案1
所有的部件都已就位,您需要做的就是将它们串在一起。
此命令提供最后一个文件,即您想要的文件,但我们需要切掉结果的第一部分
s3cmd ls s3://obs/site1/uploads/large/ | tail -n1
2020-05-01 05:23 399636 s3://obs/site1/uploads/large/87429599_1412258992269430_5992557431891165184_o.jpg
s3cmd ls s3://obs/site1/uploads/large/ | sed -rn 's!^.*(s3://)!\1!p' | tail -n1
s3://obs/site1/uploads/large/87429599_1412258992269430_5992557431891165184_o.jpg
该命令下载一个文件
s3cmd get s3://obs/site1/uploads/large/some_file_or_other /home/ankit
所以你把它们放在一起
file=$(s3cmd ls s3://obs/site1/uploads/large/ | sed -rn 's!^.*(s3://)!\1!p' | tail -n1)
s3cmd get "$file" /home/ankit
在问题的另一部分中,您讨论了下载多个文件,因此这里是此方法的扩展,用于按s3cmd ls
顺序获取最后 150 个文件:
s3cmd ls s3://obs/site1/uploads/large/ |
tail -n150 |
while read -r date time size s3path
do
s3cmd get "$s3path" /home/ankit
done
答案2
DATE=$(date +%Y-%m-%d)
FILE="$(aws s3api list-objects --bucket bucket_name --query 'Contents[?LastModified>= `'"$DATE"'`][].{Key: Key}' --output=text| grep file_name)"
aws s3 cp s3://bucket_name/${FILE} .