Amazon S3控制台: 一次下载多个文件

当我登录到我的 S3控制台时,我无法下载多个选中的文件(WebUI 只允许在选中一个文件时下载) :

Https://console.aws.amazon.com/s3

这是可以在用户策略中改变的东西,还是亚马逊的一个限制?

172441 次浏览

S3的 服务没有有意义的限制同时下载(很容易一次下载数百次是可能的) ,也没有相关的政策设置... 但是 S3的 控制台只允许您选择一个文件下载一次。

一旦下载开始,您可以启动另一个和另一个,尽可能多的浏览器将让您同时尝试。

这是不可能通过 AWS 控制台的 Web 用户界面。 但是如果安装 AWS CLI,这是一个非常简单的任务。 您可以在 < a href = “ http://docs.AWS.amazon.com/cli/best/userguide/Installing.html”rel = “ norefrer”> AWS 命令行界面中检查安装和配置步骤

然后进入命令行:

aws s3 cp --recursive s3://<bucket>/<folder> <local_folder>

这将把所有文件从给定的 S3路径复制到给定的本地路径。

我相信这是 AWS 控制台 Web 界面的一个局限性,我曾经尝试过(但是失败了)这样做。

或者,也许可以使用第三方 S3浏览器客户端,如 http://s3browser.com/

如果使用 AWS CLI,则可以使用 exclude以及 --include--recursive标志来完成此任务

aws s3 cp s3://path/to/bucket/ . --recursive --exclude "*" --include "things_you_want"

艾格。

--exclude "*" --include "*.txt"

将下载所有扩展名为. txt 的文件。更多细节 -https://docs.aws.amazon.com/cli/latest/reference/s3/

我写了一个简单的 shell 脚本下载不仅所有的文件,而且每个文件的所有版本,从一个特定的文件夹下的 AWS s3桶。在这里,你会发现它很有用

# Script generates the version info file for all the
# content under a particular bucket and then parses
# the file to grab the versionId for each of the versions
# and finally generates a fully qualified http url for
# the different versioned files and use that to download
# the content.


s3region="s3.ap-south-1.amazonaws.com"
bucket="your_bucket_name"
# note the location has no forward slash at beginning or at end
location="data/that/you/want/to/download"
# file names were like ABB-quarterly-results.csv, AVANTIFEED--quarterly-results.csv
fileNamePattern="-quarterly-results.csv"


# AWS CLI command to get version info
content="$(aws s3api list-object-versions --bucket $bucket --prefix "$location/")"
#save the file locally, if you want
echo "$content" >> version-info.json
versions=$(echo "$content" | grep -ir VersionId  | awk -F ":" '{gsub(/"/, "", $3);gsub(/,/, "", $3);gsub(/ /, "", $3);print $3 }')
for version in $versions
do
echo ############### $fileId ###################
#echo $version
url="https://$s3region/$bucket/$location/$fileId$fileNamePattern?versionId=$version"
echo $url
content="$(curl -s "$url")"
echo "$content" >> $fileId$fileNamePattern-$version.csv
echo ############### $i ###################
done

如果有人仍然在寻找一个 S3浏览器和下载我刚刚尝试 FillezillaPro (它是一个付费版本)。效果很好。

我用访问密钥和通过 IAM 设置的秘密密钥创建了到 S3的连接。连接是即时和下载所有文件夹和文件是快速的。

选择一组文件并单击 Actions-> Open 在浏览器选项卡中打开每个文件,它们立即开始下载(每次6个)。

Screenshot

如果您安装了带有 AWS Explorer 扩展的 Visual Studio,您还可以浏览到 Amazon S3(步骤1) ,选择您的 bucket (步骤2) ,选择您想要下载的所有文件(步骤3) ,然后右键单击以下载所有文件(步骤4)。

enter image description here

此外,您还可以在单个命令中多次使用 --include "filename",每次在双引号中包含不同的文件名,例如。

aws s3 mycommand --include "file1" --include "file2"

它将节省您的时间,而不是重复命令每次下载一个文件。

此外,如果您运行 Windows (tm) ,WinSCP 现在允许拖放多个选定的文件。包括子文件夹。

许多企业工作站都安装了 WinSCP,通过 SSH 在服务器上编辑文件。

我没有参与,我只是觉得这真的值得做。

在我的案例中,Aur 的不起作用,如果你正在寻找一个快速的解决方案来使用浏览器下载文件夹中的所有文件,你可以尝试在你的开发控制台中输入这段代码:

(function() {
const rows = Array.from(document.querySelectorAll('.fix-width-table tbody tr'));
const downloadButton = document.querySelector('[data-e2e-id="button-download"]');
const timeBetweenClicks = 500;


function downloadFiles(remaining) {
if (!remaining.length) {
return
}


const row = remaining[0];
row.click();
downloadButton.click();


setTimeout(() => {
downloadFiles(remaining.slice(1));
}, timeBetweenClicks)
}


downloadFiles(rows)
}())
import os
import boto3
import json


s3 = boto3.resource('s3', aws_access_key_id="AKIAxxxxxxxxxxxxJWB",
aws_secret_access_key="LV0+vsaxxxxxxxxxxxxxxxxxxxxxry0/LjxZkN")
my_bucket = s3.Bucket('s3testing')


# download file into current directory
for s3_object in my_bucket.objects.all():
# Need to split s3_object.key into path and file name, else it will give error file not found.
path, filename = os.path.split(s3_object.key)
my_bucket.download_file(s3_object.key, filename)

通过使用 awscli (即 example.sh)创建 shell 脚本,我已经完成了这项工作

#!/bin/bash
aws s3 cp s3://s3-bucket-path/example1.pdf LocalPath/Download/example1.pdf
aws s3 cp s3://s3-bucket-path/example2.pdf LocalPath/Download/example2.pdf

将可执行权限赋予 example.sh (即 sudo chmod 777 example.sh)

然后运行您的 shell 脚本 < em > ./example.sh

我通常的做法是将 s3 bucket (带有 s3fs)挂载到 Linux 机器上,然后将需要的文件压缩到一个机器上,然后从任何 PC/浏览器下载该文件。

# mount bucket in file system
/usr/bin/s3fs s3-bucket -o use_cache=/tmp -o allow_other -o uid=1000 -o mp_umask=002 -o multireq_max=5 /mnt/local-s3-bucket-mount


# zip files into one
cd /mnt/local-s3-bucket-mount
zip all-processed-files.zip *.jpg

我认为下载或上传文件的最简单方法是使用 同步命令。您也可以使用它来 sync两个 s3桶在同一时间。

aws s3 sync <LocalPath> <S3Uri> or <S3Uri> <LocalPath> or <S3Uri> <S3Uri>


# Download file(s)
aws s3 sync s3://<bucket_name>/<file_or_directory_path> .


# Upload file(s)
aws s3 sync . s3://<bucket_name>/<file_or_directory_path>


# Sync two buckets
aws s3 sync s3://<1st_s3_path> s3://<2nd_s3_path>

使用 AWS CLI,我使用“ &”在后台运行所有下载,然后等待所有 pid 完成。太快了。显然,“ aws s3 cp”知道限制并发连接的数量,因为它一次只运行100个连接。

aws --profile $awsProfile s3 cp "$s3path" "$tofile" &
pids[${npids}]=$! ## save the spawned pid
let "npids=npids+1"

然后是

echo "waiting on $npids downloads"
for pid in ${pids[*]}; do
echo $pid
wait $pid
done

我在一分钟内下载了1500多个文件(72,000字节)