正在下载整个S3存储桶?


705

我注意到似乎没有选择从AWS管理控制台下载整个S3存储桶的选项。

有没有一种简单的方法可以将所有东西都放在我的一个存储桶中?我当时正在考虑将根文件夹wget设为公用,使用它来获取所有内容,然后再次将其设为私有,但是我不知道是否有更简单的方法。


4
正如这里许多人所说的,aws s3 sync是最好的。但是没有人指出一个强大的选择:dryrun。使用此选项,您可以查看使用时从s3下载/上传的内容sync。当您不想覆盖本地或s3存储桶中的内容时,这确实很有用。使用方法是这样的:aws s3 sync <source> <destination> --dryrun在将新内容推送到存储桶之前,我一直都在使用它,以便不上载不需要的更改。
Perimosh

Answers:


1334

AWS CLI

有关更多信息,请参阅“ 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/FOLDERBUCKETNAME存储桶中的目录中递归下载所有文件和文件夹密钥。


223
首先运行aws configure,并添加你的access keysecret access key可以找到这里
Erwin Rooijakkers 2014年

12
转到此处获取Windows安装程序aws.amazon.com/cli。它从环境变量“ AWS_ACCESS_KEY_ID”中获取访问密钥ID,并从“ AWS_SECRET_ACCESS_KEY”中获取您的秘密密钥。
马特·邦德

7
我已经尝试过s3cmdCyberduck,但是对我来说,这awscli是从存储桶中下载约70.000个文件的最快方法。
Arjen 2014年

11
请注意,尽管该问题仅询问有关下载的问题,但我相信此命令将在目录和S3之间进行2向同步。如果您不尝试上传任何内容,请确保当前目录为空。
Jesse Crossen 2014年

15
@JesseCrossen该aws s3 sync命令将不会上传任何内容,但是如果S3中不存在文件,它将在本地删除文件。请参阅文档
Flimm

168

您可以s3cmd用来下载存储桶:

s3cmd --configure
s3cmd sync s3://bucketnamehere/folder /destination/folder

您可以使用另一个工具rclone。这是Rclone文档中的代码示例:

rclone sync /home/local/directory remote:bucket

5
这很慢。特别是如果您尝试增量使用它。是否有一个多线程解决方案可以饱和带宽?
彼得·拉达

下面的解决方案更好,更标准并且可以在更多平台上使用
abc123 2013年

这不适用于请求者付费的存储桶(请参见arxiv.org/help/bulk_data_s3):-(
Martin Thoma 2014年

如果必须执行模式匹配才能下载,该如何使用您的解决方案?我的问题:stackoverflow.com/questions/25086722/...
Shrikant Kakani

84

我使用了几种不同的方法将Amazon S3数据复制到本地计算机上,其中包括s3cmd,最简单的是Cyber​​duck

您所需要做的就是输入您的Amazon凭证,并使用简单的界面下载,上传,同步您的任何存储桶,文件夹或文件。

屏幕截图


很棒!适用于Windows和Mac(GPL)。
craastad 2013年


与Transmit一起工作也很好。
2015年

当我尝试保存存储桶时,CLI给我一个错误,这很正常!
Lazar Kukolj '16

哦,那真是令人意外。我之前将Cyber​​duck用于FTP,但从未想到它具有S3连接。感谢您的好提示!
jskierbi

51

您有很多选择可以做到这一点,但是最好的选择是使用AWS CLI。

这是一个演练:

  1. 在您的计算机上下载并安装AWS CLI:

  2. 配置AWS CLI:

    在此处输入图片说明

    确保您输入创建帐户时收到的有效访问权限秘密密钥。

  3. 使用以下方法同步S3存储桶:

    aws s3 sync s3://yourbucket /local/path
    

    在上面的命令中,替换以下字段:

    • yourbucket >>您要下载的S3存储桶。
    • /local/path 您要下载所有文件的本地系统中的>>路径。

我用它代替了cyberduck,因为cyberduck需要在开始下载之前“准备”文件。对于似乎需要很长时间的大量文件,我找不到有关“准备工作”实际作用的信息。CLI立即开始下载
Tashows

确保您s3://在存储桶名称中具有该前缀!!!使用aws s3 ls您不需要该s3://前缀,但需要cp命令。
cjmling

43

要使用AWS S3 CLI下载:

aws s3 cp s3://WholeBucket LocalFolder --recursive
aws s3 cp s3://Bucket/Folder LocalFolder --recursive

要使用代码下载,请使用AWS开发工具包。

要使用GUI下载,请使用Cyber​​duck。


1
如何忽略某些文件或文件夹?
Nabin

1
@Nabin您可以使用--include&--exclude与通配符排除某些文件或文件夹,如下所示: aws s3 cp s3://my-bucket-name ./local-folder --recursive --include "*" --exclude "excludeFolder/*" --exclude "includeFolder/excludeFile.txt"
DarkCenobyte

21

对于Windows,S3浏览器是我发现的最简单的方法。它是出色的软件,对于非商业用途是免费的。


3
我刚刚尝试了“将所有文件下载到...”选项(我想这等同于“下载整个s3存储桶”,它说我需要Pro版本。)
Jack Ukleja 2013年

2
更新:但是我能够在存储桶中下载一个完整的文件夹,足以满足我的需求……
Jack Ukleja 2013年

是的,免费版本非常有限,您可以全选并下载,但仅限于2个同时传输
Hayden Thring

在Ubuntu 17.1和s3cmd上遇到一些python3支持错误后,正在寻找Windows的简单版本,这很好用。
edencorbin

21

如果您使用Visual Studio,请下载“ 适用于Visual Studio的AWS工具包 ”。

安装后,转到Visual Studio-AWS Explorer-S3-您的存储桶-双击

在窗口中,您将能够选择所有文件。右键单击并下载文件。



12

可以帮助某些OS X用户的另一个选项是“发送”。

这是一个FTP程序,还可以让您连接到S3文件。而且,它可以选择将任何FTP或S3存储作为Finder中的文件夹挂载,但这只是有限的时间。


12

@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倍。


1
这是真正的答案。刚刚测试过,它从ec2传输的速度约为2.3GB / min。没有并发选项约1GB / min。救生员。
卡斯滕

9

我已经对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之后,“ 下载整个存储桶 ”可能会做您想要的。


除非您需要Java解决方案,否则请使用上面的aws cli答案。
jeremyjjbrown 2014年

创建一个新文件夹,并保持不变
Jisson

7

AWS sdk API将是上传整个文件夹并存储到s3并将整个s3存储桶下载到本地的最佳选择。

用于将整个文件夹上传到s3

aws s3 sync . s3://BucketName

本地下载整个s3存储桶

aws s3 sync s3://BucketName . 

您还可以为s3中的特定文件夹分配路径(例如BucketName / Path),以进行下载



5

如果您将Firefox与S3Fox结合使用,则可以选择所有文件(首先选择并选择Shift和Shift),然后右键单击并下载所有文件...我已经完成了500多个文件,而没有任何问题


即使在AWS控制台中创建了“伪文件夹”,该操作也不适用于存储桶中的子文件夹。(截至本评论撰写之
Wesley

确认无法正常工作,我大约有12k顶级密钥=子文件夹),S3Fox甚至无法启动。还必须坚持列出所有存储桶的权限!
彼得·拉达

4

在Windows中,我首选的GUI工具是用于S3的Cloudberry Explorer,http: //www.cloudberrylab.com/free-amazon-s3-explorer-cloudfront-IAM.aspx 。具有相当完善的文件浏览器,类似ftp的界面。


3

如果那里只有文件(没有子目录),一种快速的解决方案是选择所有文件(click在第一个,Shift+click最后一个),然后按Enter或,right click然后选择Open。对于大多数数据文件,这会将它们直接下载到您的计算机上。


3

要添加另一个GUI选项,我们使用WinSCP的S3功能。连接非常容易,只需要在UI中输入访问密钥和秘密密钥即可。然后,您可以从任何可访问的存储桶中浏览和下载所需的任何文件,包括递归下载嵌套文件夹。

由于通过安全清除新软件可能是一个挑战,而且WinSCP相当普遍,因此仅使用它而不是尝试安装一个更专用的实用程序确实是有益的。


1
  1. Windows用户需要从这个环节里面也有安装说明下载S3EXPLORER: - http://s3browser.com/download.aspx

  2. 然后为您提供AWS凭证,例如s3explorer的密钥,访问密钥和区域,此链接包含s3explorer的配置说明:复制浏览器中的粘贴链接:s3browser.com/s3browser-first-run.aspx

  3. 现在,您的所有s3存储桶将在s3explorer的左侧面板上可见。

  4. 只需选择存储桶,然后单击左上角的存储桶菜单,然后从菜单中选择将所有文件下载到选项。下面是相同的屏幕截图:

铲斗选择屏幕

  1. 然后浏览文件夹以将存储桶下载到特定位置

  2. 单击确定,您的下载将开始。


1

aws sync是完美的解决方案。它不做两种方式..它是从源到目标的一种方式。另外,如果您有很多物品在存储桶中,则最好先创建s3端点,这样下载速度会更快(因为下载不是通过Internet而是通过Intranet进行)


1

这里有一些东西可以下载所有存储桶,列出它们,列出它们的内容。

    //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.");
}

}


1

您可以使用s3cmd命令简单地获取它:

s3cmd get --recursive --continue s3://test-bucket local-directory/

1

正如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> 

例如3,我可以将Bucket文件夹指向另一个Bucket文件夹吗?实际上,我想将存储桶文件夹同步到另一个存储桶文件夹。
lukai

@lukai是的。这就是我在示例3中给出的内容。您只需要具有源和目标的s3存储桶URI
Keet Sugathadasa,2018年

1

如果您只想从AWS下载存储桶,请首先在计算机中安装AWS CLI。在终端中,将目录更改为要下载文件的目录,然后运行此命令。

aws s3 sync s3://bucket-name .

如果您还想要同步本地目录和s3目录(如果您在本地文件夹中添加了一些文件),请运行以下命令:

aws s3 sync . s3://bucket-name


1

您可以使用此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不说明其安全后果的情况下使用,这是犯罪。
Martin Prikryl

感谢您提供有关安全性的信息。我遇到了这个问题,并使用了此参考文件docs.aws.amazon.com/cli/latest/reference
-Dimuthu

1

如果存储桶很大,则有一个调用的命令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),这可能会影响您的账单,请先计算费用


0

正如@layke所说,从S3 cli下载文件是一种安全可靠的最佳做法。但是在某些情况下,人们需要使用wget下载文件,这是解决方案

aws s3 presign s3://<your_bucket_name/>

此presign将为您提供临时的公共URL,您可以使用presign_url从w3中下载内容,如果使用wget或任何其他下载客户端,则可以使用presign_url。


0

试试这个命令:

aws s3 sync yourBucketnameDirectory yourLocalDirectory

例如,如果您的存储桶名称为myBucket,本地目录为c:\local,则:

aws s3 sync s3://myBucket c:\local

有关awscli的更多信息,请检查此 aws cli安装

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.