Amazon S3 控制台:一次下载多个文件
Amazon S3 console: download multiple files at once
当我登录到我的 S3 控制台时 我无法下载多个选定的文件(WebUI 仅在选定一个文件时才允许下载):
https://console.aws.amazon.com/s3
这是可以在用户政策中更改的内容还是亚马逊的限制?
S3 服务 对同时下载没有有意义的限制(一次轻松下载数百个是可能的)并且没有与此相关的策略设置...但是S3 console 一次只能select下载一个文件。
下载开始后,您可以开始一个又一个,您的浏览器允许您同时尝试多少次。
无法通过 AWS 控制台 Web 用户界面。
但如果您安装 AWS CLI,这是一项非常简单的任务。
您可以在 AWS Command Line Interface
中查看 Installing 中的安装和配置步骤
之后进入命令行:
aws s3 cp --recursive s3://<bucket>/<folder> <local_folder>
这会将所有文件从给定的 S3 路径复制到给定的本地路径。
我认为这是 AWS 控制台 Web 界面的限制,我自己尝试过(但失败了)。
或者,也许使用第 3 方 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(/"/, "", );gsub(/,/, "", );gsub(/ /, "", );print }')
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 浏览器和下载器,我刚刚尝试了 Fillezilla Pro(它是付费版本)。效果很好。
我使用通过 IAM 设置的访问密钥和秘密密钥创建了到 S3 的连接。连接是即时的,所有文件夹和文件的下载都很快。
选择一堆文件并单击“操作”->“打开”在浏览器选项卡中打开每个文件,然后立即开始下载(一次 6 个)。
如果您 Visual Studio 安装了 AWS Explorer 扩展,您还可以浏览至 Amazon S3(第 1 步),select 您的存储桶(第 2 步),select 其他您要下载的文件(第 3 步)并右键单击以下载所有文件(第 4 步)。
您也可以在单个命令中多次使用 --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)
我已经完成了,通过使用 aws cli 创建 shell 脚本(即:example.sh)
#!/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 脚本 ./example.sh
我通常做的是将 s3 存储桶(带有 s3fs)安装到 linux 机器中并将我需要的文件压缩到一个机器中,然后我只需从任何 pc/browser 下载该文件。
# 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
我认为下载或上传文件的最简单方法是使用 aws s3 sync 命令。您也可以同时使用它 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,我 运行 使用“&”在后台进行所有下载,然后等待所有 pids 完成。速度快得惊人。显然“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 字节)
当我登录到我的 S3 控制台时 我无法下载多个选定的文件(WebUI 仅在选定一个文件时才允许下载):
https://console.aws.amazon.com/s3
这是可以在用户政策中更改的内容还是亚马逊的限制?
S3 服务 对同时下载没有有意义的限制(一次轻松下载数百个是可能的)并且没有与此相关的策略设置...但是S3 console 一次只能select下载一个文件。
下载开始后,您可以开始一个又一个,您的浏览器允许您同时尝试多少次。
无法通过 AWS 控制台 Web 用户界面。 但如果您安装 AWS CLI,这是一项非常简单的任务。 您可以在 AWS Command Line Interface
中查看 Installing 中的安装和配置步骤之后进入命令行:
aws s3 cp --recursive s3://<bucket>/<folder> <local_folder>
这会将所有文件从给定的 S3 路径复制到给定的本地路径。
我认为这是 AWS 控制台 Web 界面的限制,我自己尝试过(但失败了)。
或者,也许使用第 3 方 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(/"/, "", );gsub(/,/, "", );gsub(/ /, "", );print }')
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 浏览器和下载器,我刚刚尝试了 Fillezilla Pro(它是付费版本)。效果很好。
我使用通过 IAM 设置的访问密钥和秘密密钥创建了到 S3 的连接。连接是即时的,所有文件夹和文件的下载都很快。
选择一堆文件并单击“操作”->“打开”在浏览器选项卡中打开每个文件,然后立即开始下载(一次 6 个)。
如果您 Visual Studio 安装了 AWS Explorer 扩展,您还可以浏览至 Amazon S3(第 1 步),select 您的存储桶(第 2 步),select 其他您要下载的文件(第 3 步)并右键单击以下载所有文件(第 4 步)。
您也可以在单个命令中多次使用 --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)
我已经完成了,通过使用 aws cli 创建 shell 脚本(即:example.sh)
#!/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 脚本 ./example.sh
我通常做的是将 s3 存储桶(带有 s3fs)安装到 linux 机器中并将我需要的文件压缩到一个机器中,然后我只需从任何 pc/browser 下载该文件。
# 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
我认为下载或上传文件的最简单方法是使用 aws s3 sync 命令。您也可以同时使用它 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,我 运行 使用“&”在后台进行所有下载,然后等待所有 pids 完成。速度快得惊人。显然“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 字节)