Answers:
有关更多信息,请参阅“ AWS CLI命令参考 ”。
AWS最近发布了他们的命令行工具,其工作原理与boto相似,可以使用以下命令进行安装
sudo easy_install awscli
要么
sudo pip install awscli
安装后,您可以简单地运行:
aws s3 sync s3://<source_bucket> <local_destination>
例如:
aws s3 sync s3://mybucket .
将所有对象下载mybucket
到当前目录中。
并将输出:
download: s3://mybucket/test.txt to test.txt
download: s3://mybucket/test2.txt to test2.txt
这将使用单向同步下载所有文件。除非您指定,否则它将不会删除当前目录中的任何现有文件,并且不会更改或删除S3上的任何文件。 --delete
您也可以将S3存储桶转换为S3存储桶,或在S3存储桶本地同步。
查看文档和其他示例。
上面的示例是如何下载完整存储桶的,您还可以通过执行以下操作来递归下载文件夹
aws s3 cp s3://BUCKETNAME/PATH/TO/FOLDER LocalFolderName --recursive
这将指示CLI PATH/TO/FOLDER
在BUCKETNAME
存储桶中的目录中递归下载所有文件和文件夹密钥。
s3cmd
和Cyberduck
,但是对我来说,这awscli
是从存储桶中下载约70.000个文件的最快方法。
您可以s3cmd
用来下载存储桶:
s3cmd --configure
s3cmd sync s3://bucketnamehere/folder /destination/folder
您可以使用另一个工具rclone
。这是Rclone文档中的代码示例:
rclone sync /home/local/directory remote:bucket
我使用了几种不同的方法将Amazon S3数据复制到本地计算机上,其中包括s3cmd
,最简单的是Cyberduck。
您所需要做的就是输入您的Amazon凭证,并使用简单的界面下载,上传,同步您的任何存储桶,文件夹或文件。
您有很多选择可以做到这一点,但是最好的选择是使用AWS CLI。
这是一个演练:
在您的计算机上下载并安装AWS CLI:
配置AWS CLI:
确保您输入创建帐户时收到的有效访问权限和秘密密钥。
使用以下方法同步S3存储桶:
aws s3 sync s3://yourbucket /local/path
在上面的命令中,替换以下字段:
yourbucket
>>您要下载的S3存储桶。/local/path
您要下载所有文件的本地系统中的>>路径。s3://
在存储桶名称中具有该前缀!!!使用aws s3 ls
您不需要该s3://
前缀,但需要cp
命令。
要使用AWS S3 CLI下载:
aws s3 cp s3://WholeBucket LocalFolder --recursive
aws s3 cp s3://Bucket/Folder LocalFolder --recursive
要使用代码下载,请使用AWS开发工具包。
要使用GUI下载,请使用Cyberduck。
aws s3 cp s3://my-bucket-name ./local-folder --recursive --include "*" --exclude "excludeFolder/*" --exclude "includeFolder/excludeFile.txt"
对于Windows,S3浏览器是我发现的最简单的方法。它是出色的软件,对于非商业用途是免费的。
如果您使用Visual Studio,请下载“ 适用于Visual Studio的AWS工具包 ”。
安装后,转到Visual Studio-AWS Explorer-S3-您的存储桶-双击
在窗口中,您将能够选择所有文件。右键单击并下载文件。
将此命令与AWS CLI结合使用:
aws s3 cp s3://bucketname . --recursive
@Layke的答案很好,但是如果您有大量数据并且不想永远等待,则应阅读“ AWS CLI S3配置 ”。
以下命令将告诉AWS CLI使用1,000个线程来执行作业(每个文件或一个多部分副本的一部分)并预执行100,000个作业:
aws configure set default.s3.max_concurrent_requests 1000
aws configure set default.s3.max_queue_size 100000
运行这些sync
命令后,可以使用简单的命令:
aws s3 sync s3://source-bucket/source-path s3://destination-bucket/destination-path
要么
aws s3 sync s3://source-bucket/source-path c:\my\local\data\path
在具有CPU 4内核和16GB RAM的系统上,对于我的情况(3-50GB文件),同步/复制速度从大约9.5MiB / s变为700 + MiB / s,与默认配置相比,速度提高了70倍。
我已经对S3进行了一些开发,但还没有找到下载整个存储桶的简单方法。
如果要用Java编写代码,可以轻松使用jets3t lib创建存储桶列表并遍历该列表以下载它们。
首先,从AWS管理领事那里获取一个公共私钥集,以便您可以创建一个S3service对象:
AWSCredentials awsCredentials = new AWSCredentials(YourAccessKey, YourAwsSecretKey);
s3Service = new RestS3Service(awsCredentials);
然后,获取您的bucket对象的数组:
S3Object[] objects = s3Service.listObjects(YourBucketNameString);
最后,遍历该数组以一次下载一个对象:
S3Object obj = s3Service.getObject(bucket, fileName);
file = obj.getDataInputStream();
我将连接代码放在线程安全的单例中。出于明显的原因,省略了必要的try / catch语法。
如果您想用Python编写代码,则可以改用Boto。
环顾BucketExplorer之后,“ 下载整个存储桶 ”可能会做您想要的。
您可以使用https://github.com/minio/mc进行此操作:
mc cp -r https://s3-us-west-2.amazonaws.com/bucketName/ localdir
mc还支持会话,可恢复的下载,上载等等。mc
支持Linux,OS X和Windows操作系统。用Golang编写,并在Apache 2.0版下发布。
如果那里只有文件(没有子目录),一种快速的解决方案是选择所有文件(click
在第一个,Shift+click
最后一个),然后按Enter
或,right click
然后选择Open
。对于大多数数据文件,这会将它们直接下载到您的计算机上。
要添加另一个GUI选项,我们使用WinSCP的S3功能。连接非常容易,只需要在UI中输入访问密钥和秘密密钥即可。然后,您可以从任何可访问的存储桶中浏览和下载所需的任何文件,包括递归下载嵌套文件夹。
由于通过安全清除新软件可能是一个挑战,而且WinSCP相当普遍,因此仅使用它而不是尝试安装一个更专用的实用程序确实是有益的。
Windows用户需要从这个环节里面也有安装说明下载S3EXPLORER: - http://s3browser.com/download.aspx
然后为您提供AWS凭证,例如s3explorer的密钥,访问密钥和区域,此链接包含s3explorer的配置说明:复制浏览器中的粘贴链接:s3browser.com/s3browser-first-run.aspx
现在,您的所有s3存储桶将在s3explorer的左侧面板上可见。
只需选择存储桶,然后单击左上角的存储桶菜单,然后从菜单中选择将所有文件下载到选项。下面是相同的屏幕截图:
然后浏览文件夹以将存储桶下载到特定位置
单击确定,您的下载将开始。
aws sync是完美的解决方案。它不做两种方式..它是从源到目标的一种方式。另外,如果您有很多物品在存储桶中,则最好先创建s3端点,这样下载速度会更快(因为下载不是通过Internet而是通过Intranet进行)
这里有一些东西可以下载所有存储桶,列出它们,列出它们的内容。
//connection string
private static void dBConnection() {
app.setAwsCredentials(CONST.getAccessKey(), CONST.getSecretKey());
conn = new AmazonS3Client(app.getAwsCredentials());
app.setListOfBuckets(conn.listBuckets());
System.out.println(CONST.getConnectionSuccessfullMessage());
}
private static void downloadBucket() {
do {
for (S3ObjectSummary objectSummary : app.getS3Object().getObjectSummaries()) {
app.setBucketKey(objectSummary.getKey());
app.setBucketName(objectSummary.getBucketName());
if(objectSummary.getKey().contains(CONST.getDesiredKey())){
//DOWNLOAD
try
{
s3Client = new AmazonS3Client(new ProfileCredentialsProvider());
s3Client.getObject(
new GetObjectRequest(app.getBucketName(),app.getBucketKey()),
new File(app.getDownloadedBucket())
);
} catch (IOException e) {
e.printStackTrace();
}
do
{
if(app.getBackUpExist() == true){
System.out.println("Converting back up file");
app.setCurrentPacsId(objectSummary.getKey());
passIn = app.getDataBaseFile();
CONVERT= new DataConversion(passIn);
System.out.println(CONST.getFileDownloadedMessage());
}
}
while(app.getObjectExist()==true);
if(app.getObjectExist()== false)
{
app.setNoObjectFound(true);
}
}
}
app.setS3Object(conn.listNextBatchOfObjects(app.getS3Object()));
}
while (app.getS3Object().isTruncated());
}
/ ----------------------------扩展方法------------------- ------------------ /
//Unzip bucket after download
public static void unzipBucket() throws IOException {
unzip = new UnZipBuckets();
unzip.unZipIt(app.getDownloadedBucket());
System.out.println(CONST.getFileUnzippedMessage());
}
//list all S3 buckets
public static void listAllBuckets(){
for (Bucket bucket : app.getListOfBuckets()) {
String bucketName = bucket.getName();
System.out.println(bucketName + "\t" + StringUtils.fromDate(bucket.getCreationDate()));
}
}
//Get the contents from the auto back up bucket
public static void listAllBucketContents(){
do {
for (S3ObjectSummary objectSummary : app.getS3Object().getObjectSummaries()) {
if(objectSummary.getKey().contains(CONST.getDesiredKey())){
System.out.println(objectSummary.getKey() + "\t" + objectSummary.getSize() + "\t" + StringUtils.fromDate(objectSummary.getLastModified()));
app.setBackUpCount(app.getBackUpCount() + 1);
}
}
app.setS3Object(conn.listNextBatchOfObjects(app.getS3Object()));
}
while (app.getS3Object().isTruncated());
System.out.println("There are a total of : " + app.getBackUpCount() + " buckets.");
}
}
正如Neel Bhaat在此博客中解释的那样,有许多不同的工具可用于此目的。AWS提供了一些工具,其中大多数是第三方工具。所有这些工具都要求您在工具本身中保存您的AWS账户密钥和机密。使用第三方工具时要格外小心,因为保存的凭据可能会导致您,您的全部身价损失并使您丧命。
因此,我始终建议为此目的使用AWS CLI。您可以从此链接简单地安装它。接下来,运行以下命令并将您的密钥秘密值保存在AWS CLI中。
aws configure
并使用以下命令将您的AWS S3存储桶同步到本地计算机。(本地计算机应已安装AWS CLI)
aws s3 sync <source> <destination>
例子:
1)对于AWS S3到本地存储
aws s3 sync <S3Uri> <LocalPath>
2)从本地存储到AWS S3
aws s3 sync <LocalPath> <S3Uri>
3)从AWS s3存储桶到另一个存储桶
aws s3 sync <S3Uri> <S3Uri>
您可以使用此AWS cli命令将整个S3存储桶内容下载到本地文件夹
aws s3 sync s3://your-bucket-name "Local Folder Path"
如果看到这样的错误
fatal error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)
--no-verify-ssl(布尔值)
默认情况下,与AWS服务通信时,AWS CLI使用SSL。对于每个SSL连接,AWS CLI将验证SSL证书。此选项将覆盖验证SSL证书的默认行为。 参考
将此标签与--no-verify-ssl命令一起使用
aws s3 sync s3://your-bucket-name "Local Folder Path" --no-verify-ssl
s3 sync
已经覆盖上述多次。+建议在--no-verify-ssl
不说明其安全后果的情况下使用,这是犯罪。
如果存储桶很大,则有一个调用的命令s4cmd
可以建立并行连接并缩短下载时间:
要像在Debian上安装它
apt install s4cmd
如果您有点子:
pip install s4cmd
它将读取~/.s3cfg
文件(如果存在)(如果未安装s3cmd
并运行s3cmd --configure
),或者您可以--access-key=ACCESS_KEY --secret-key=SECRET_KEY
在命令中指定。
cli类似于 s3cmd
。在您的情况下sync
,建议您使用a ,因为您可以取消下载并重新开始下载,而不必重新下载文件。
s4cmd [--access-key=ACCESS_KEY --secret-key=SECRET_KEY] sync s3://<your-bucket> /some/local/dir
请注意,如果您下载大量数据(> 1TB),这可能会影响您的账单,请先计算费用
aws s3 sync
是最好的。但是没有人指出一个强大的选择:dryrun
。使用此选项,您可以查看使用时从s3下载/上传的内容sync
。当您不想覆盖本地或s3存储桶中的内容时,这确实很有用。使用方法是这样的:aws s3 sync <source> <destination> --dryrun
在将新内容推送到存储桶之前,我一直都在使用它,以便不上载不需要的更改。