下载整个S3存储桶?

时间:2011-12-28 17:49:05

标签: amazon-s3 amazon-web-services

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

有一种简单的方法可以抓住我的一个桶中的所有东西吗?我正在考虑将根文件夹公开,使用wget抓取所有内容,然后再将其设为私有,但我不知道是否有更简单的方法。

33 个答案:

答案 0 :(得分:1037)

AWS CLI

Documentation for AWS CLI

AWS最近发布了他们的命令行工具。这很像boto,可以使用sudo easy_install awsclisudo pip install awscli

进行安装

安装完成后,您只需运行:

<强>命令

aws s3 sync s3://mybucket .

<强>输出

download: s3://mybucket/test.txt to test.txt
download: s3://mybucket/test2.txt to test2.txt

这将下载所有文件(单向同步)。它将删除当前目录中的任何现有文件(除非您specify --delete),并且它不会更改或删除S3上的任何文件。

您还可以执行S3存储桶到S3存储桶,或本地到S3存储桶同步。

查看文档和其他示例:

http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html

从存储桶下载文件夹

虽然以上示例是如何下载完整存储桶,但您也可以通过执行

来反复下载文件夹
aws s3 cp s3://BUCKETNAME/PATH/TO/FOLDER LocalFolderName --recursive

这将指示CLI以递归方式在PATH/TO/FOLDER存储桶中的BUCKETNAME目录中下载所有文件和文件夹密钥。

答案 1 :(得分:157)

您可以使用s3cmd下载您的存储桶。

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

<强>更新

您可以使用另一种名为Rclone的工具。下面是Rclone文档中的代码示例。

rclone sync /home/local/directory remote:bucket

答案 2 :(得分:74)

我使用了一些不同的方法将Amazon S3数据复制到本地计算机,包括s3cmd,到目前为止最简单的方法是Cyberduck。您只需输入您的Amazon凭据并使用简单界面下载/上传/同步您的任何存储桶/文件夹/文件。

Screenshot

答案 3 :(得分:37)

你基本上有很多选择,但最好的选择是使用 AWS CLI

这是一个演练

  • 第1步

在您的计算机中下载并安装AWS CLI

Install the AWS CLI using the MSI Installer (Windows)

Install the AWS CLI using the Bundled Installer (Linux, OS X, or Unix)

  • 第2步

配置AWS CLI

enter image description here

确保您输入了在创建帐户时收到的有效访问密钥密钥

  • 第3步

使用以下命令同步s3存储桶

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

将以上命令替换为以下数据

yourbucket &gt;&gt;您要下载的s3存储桶

/ local / path &gt;&gt;您希望下载所有文件的本地系统中的路径

希望这有帮助!

答案 4 :(得分:36)

使用AWS S3 CLI下载

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

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

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

希望它能帮助...... :)

答案 5 :(得分:17)

S3浏览器是我找到的最简单的方法。它是优秀的软件......它是免费的非商业用途。仅限Windows。

http://s3browser.com/

答案 6 :(得分:16)

如果您使用Visual Studio,请下载http://aws.amazon.com/visualstudio/

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

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

答案 7 :(得分:9)

可以帮助某些 osx用户的另一个选项是传输。这是一个ftp程序,也可以让你连接到你的s3文件。并且它可以选择在finder中将任何ftp或s3存储作为文件夹安装。但这只是在有限的时间内。

答案 8 :(得分:8)

我已经为s3做了一些开发,我还没有找到一个简单的方法来下载整个存储桶。 如果你想用Java编写代码,jets3t lib很容易用来创建一个桶列表并迭代该列表来下载它们。

http://jets3t.s3.amazonaws.com/downloads.html

首先从AWS管理部门获取公共私钥集,以便您可以创建S3service对象...

AWSCredentials awsCredentials = new AWSCredentials(YourAccessKey, YourAwsSecretKey);
s3Service = new RestS3Service(awsCredentials);

然后获取你的桶对象数组......

S3Object[] objects = s3Service.listObjects(YourBucketNameString);

最后,迭代该数组,使用此代码一次下载一个对象...

S3Object obj = s3Service.getObject(bucket, fileName);
            file = obj.getDataInputStream();

我将连接代码放在线程安全的单例中。出于显而易见的原因,省略了必要的try / catch语法。

如果您更喜欢Python代码,那么可以使用Boto代替。

看完BucketExplorer之后,我做了你想做的事。 https://forums.aws.amazon.com/thread.jspa?messageID=248429

答案 9 :(得分:7)

将此命令与AWS CLI

一起使用
aws s3 cp s3://bucketname. --recursive

答案 10 :(得分:7)

@Layke的回答很好,但是如果你有大量的数据并且不想永远等待,你应该密切注意how to get the AWS S3 CLI sync command to synchronize buckets with massive parallelization上的这个文档。以下命令将告诉AWS CLI使用1,000个线程来执行作业(每个小文件或多部分副本的一部分)并预测100,000个作业:

aws configure set default.s3.max_concurrent_requests 1000
aws configure set default.s3.max_queue_size 100000

运行这些后,您可以使用simple 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倍默认配置。

答案 11 :(得分:4)

如果你使用带有S3Fox的Firefox,可以让你选择所有文件(shift-select first and last)和rightclick并下载所有文件...我用500多个文件做了没有问题

答案 12 :(得分:3)

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

答案 13 :(得分:3)

您可以使用https://github.com/minio/mc执行此操作:

document.getElementById('container').style.webkitOverflowScrolling = 'auto';

mc还支持会话,可恢复下载,上传等等。 mc cp -r https://s3-us-west-2.amazonaws.com/bucketName/ localdir 支持Linux,OS X和Windows操作系统。用Golang编写,在Apache 2.0版下发布。

答案 14 :(得分:3)

如果您只有文件(没有子目录),快速解决方案是选择所有文件(第一个click,最后一个Shift+click)并点击Enter或{ {1}}并选择right click。对于大多数数据文件,这将直接下载到您的计算机。

答案 15 :(得分:3)

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

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

答案 16 :(得分:3)

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

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

aws s3 sync . s3://BucketName

用于在本地下载整个s3存储桶

aws s3 sync s3://BucketName . 

您还可以为s3中的特定文件夹分配类似于BucketName / Path的路径以下载

答案 17 :(得分:1)

您可以使用s3cmd命令轻松获取它:

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

答案 18 :(得分:1)

100% 对我有用,我已经从 aws s3 backet 下载了所有文件。

  1. 安装 aws cli(并选择您的操作系统,按照步骤操作) https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html

  2. 检查 aws 版本:aws --version

  3. 运行配置命令:aws configure [https://www.edureka.co/community/?qa=blob&qa_blobid=11556266437524396613][1]

  4. aws s3 cp s3://yourbucketname your\local\path --recursive

查看此链接: https://www.edureka.co/community/32955/how-to-download-an-entire-bucket-from-s3-to-local-folder

答案 19 :(得分:1)

您只需要传递--recursive和--include“ *”

aws --region "${BUCKET_REGION}" s3 cp s3://${BUCKET}${BUCKET_PATH}/ ${LOCAL_PATH}/tmp --recursive --include "*" 2>&1

答案 20 :(得分:1)

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

aws s3 sync s3://bucket-name .

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

aws s3 sync . s3://bucket-name

答案 21 :(得分:1)

正如Neel Bhaat在本blog中所解释的那样,有许多不同的工具可用于此目的。有些是AWS提供的,其中大多数是第三方工具。所有这些工具都要求您在工具本身中保存您的AWS账户密钥和密钥。在使用第三方工具时要非常谨慎,因为您保存的凭据可能会花费您,您的全部价值并让您失去信心。

因此,我总是建议使用AWS CLI来实现此目的。您只需从this link安装即可。接下来,运行以下命令并在AWS CLI中保存密钥,机密值。

aws configure

并使用以下命令将AWS S3 Bucket同步到本地计算机。 (本地计算机应安装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> 

答案 22 :(得分: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.");
}

}

答案 23 :(得分:1)

aws sync是完美的解决方案。它不是双向的。它是从源到目的地的单向。此外,如果您有很多项目,最好先创建s3端点,以便下载速度更快(因为下载不是通过互联网而是通过内部网进行)而且不收取费用

答案 24 :(得分:1)

  1. Windows用户需要从此链接下载S3EXPLORER,该链接还包含安装说明: - http://s3browser.com/download.aspx

  2. 然后向s3explorer提供诸如secretkey,accesskey和region之类的AWS凭证,此链接包含s3explorer的配置说明:在浏览器中复制粘贴链接:s3browser.com/s3browser-first-run.aspx

  3. 现在你的所有s3存储桶都会在s3explorer的左侧面板上显示。

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

  5. Bucket Selection Screen

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

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

答案 25 :(得分:0)

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

aws s3 presign s3://<your_bucket_name/>

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

答案 26 :(得分:0)

我的评论并没有真正添加新的解决方案。正如这里许多人所说的,aws s3 sync是最好的。但是没有人指出一个强大的选项:dryrun。使用此选项,您可以查看使用sync时从s3下载/上传的内容。当您不想覆盖本地或s3存储桶中的内容时,这确实很有用。用法如下:

aws s3 sync <source> <destination> --dryrun

在将新内容推送到存储桶之前,我一直都在使用它,以便不上传不需要的更改。

答案 27 :(得分:0)

尝试以下命令:

aws s3 sync yourBucketnameDirectory yourLocalDirectory

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

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

有关awscli的更多信息,请检查此 here

答案 28 :(得分:0)

AWS CLI是在本地下载整个S3存储桶的最佳选择。

  1. Install AWS CLI。

  2. Configure AWS CLI,用于使用默认安全凭证和默认AWS区域。

  3. 要下载整个S3存储桶,请使用命令

    使s3同步s3:// yourbucketname localpath

针对不同的AWS服务使用AWS cli的参考:https://docs.aws.amazon.com/cli/latest/reference/

答案 29 :(得分:0)

您可以使用此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 CLI在与AWS服务通信时使用SSL。对于每个SSL连接,AWS CLI将验证SSL证书。此选项将覆盖验证SSL证书的默认行为。 reference

将此标签与命令-no-verify-ssl

一起使用
aws s3 sync s3://your-bucket-name "Local Folder Path" --no-verify-ssl

答案 30 :(得分:0)

如果存储桶很大,则有一个名为s4cmd的命令可以建立并行连接并缩短下载时间:

要像在Debian上安装它

apt install s4cmd

如果您有点子:

pip install s4cmd

它将读取~/.s3cfg文件(如果存在)(如果未安装s3cmd并运行s3cmd --configure),或者您可以在命令中指定--access-key=ACCESS_KEY --secret-key=SECRET_KEY

cli类似于s3cmd。对于您的情况,建议使用sync,因为您可以取消下载并重新开始下载,而不必重新下载文件。

s4cmd [--access-key=ACCESS_KEY --secret-key=SECRET_KEY] sync s3://<your-bucket> /some/local/dir

请注意,如果下载大量数据(> 1TB)可能会影响您的账单,请先计算费用

答案 31 :(得分:0)

使用awscli将文件下载/上传到s3总是更好。同步将帮助您轻松恢复。

aws s3 sync s3://bucketname/ .

答案 32 :(得分:0)

除了对 aws s3 sync 的建议之外,我还建议您查看 s5cmd (https://github.com/peak/s5cmd)。

根据我的经验,我发现对于多次下载或大量下载,这比 AWS CLI 快得多。

s5cmd 支持通配符,所以类似这样的事情会起作用:

s5cmd cp s3://bucket-name/* ./folder