904

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

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

4

34 回答 34

1680

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/FOLDER目录中递归下载所有文件和文件夹密钥。BUCKETNAME

于 2013-09-12T10:57:41.257 回答
188

您可以使用s3cmd以下方式下载您的存储桶:

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

您可以使用另一种工具,称为rclone. 这是 Rclone 文档中的代码示例:

rclone sync /home/local/directory remote:bucket
于 2012-03-10T15:57:01.317 回答
106

我使用了几种不同的方法将 Amazon S3 数据复制到本地机器,包括s3cmd,到目前为止最简单的是Cyber​​duck

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

截屏

于 2012-10-04T21:14:06.830 回答
76

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

这是一个演练:

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

  2. 配置 AWS CLI:

    在此处输入图像描述

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

  3. 使用以下命令同步 S3 存储桶:

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

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

    • yourbucket>> 您要下载的 S3 存储桶。
    • /local/path>> 本地系统中要下载所有文件的路径。
于 2017-12-12T13:26:48.093 回答
63

使用 AWS S3 CLI 下载:

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

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

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

于 2017-04-10T11:23:12.727 回答
30

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

于 2018-01-05T13:24:23.290 回答
28

如果您使用 Visual Studio,请下载“ AWS Toolkit for Visual Studio ”。

安装后,进入 Visual Studio - AWS Explorer - S3 - 你的存储桶 - 双击

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

于 2014-02-04T00:23:52.923 回答
25

对于 Windows,S3 浏览器是我发现的最简单的方法。它是一款优秀的软件,并且可以免费用于非商业用途。

于 2012-12-19T07:38:33.313 回答
18

将此命令与AWS CLI一起使用:

aws s3 cp s3://bucketname . --recursive
于 2016-11-04T21:30:07.073 回答
15

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

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

例如(Windows):aws s3 cp s3://yourbucketname C:\aws-s3-backup\project-name --recursive

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

于 2021-05-06T14:58:08.033 回答
14

另一个可以帮助某些 OS X 用户的选项是 Transmit。

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

于 2013-10-17T07:50:47.123 回答
12

我已经为 S3 做了一些开发,但我还没有找到一种简单的方法来下载整个存储桶。

如果您想用 Java 编写代码,jets3t库很容易用于创建存储桶列表并遍历该列表以下载它们。

首先,从 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 后,“下载整个存储桶”可能会满足您的需求。

于 2011-12-28T21:30:02.320 回答
8

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

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

aws s3 sync . s3://BucketName

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

aws s3 sync s3://BucketName . 

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

于 2018-12-27T04:24:33.103 回答
7

您可以使用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 版下发布。

于 2015-11-12T00:43:59.667 回答
7

如果您只想从 AWS 下载存储桶,请先在您的机器上安装 AWS CLI。在终端中将目录更改为要下载文件的位置并运行此命令。

aws s3 sync s3://bucket-name .

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

aws s3 sync . s3://bucket-name
于 2018-09-20T07:06:19.950 回答
6

如果您将 Firefox 与 S3Fox 一起使用,那么您可以选择所有文件(shift-select first 和 last)并右键单击并下载所有文件。

我已经完成了 500 多个文件,没有任何问题。

于 2012-09-14T06:23:36.483 回答
6

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

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

于 2019-03-18T13:49:15.030 回答
6

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

  1. 安装AWS CLI。

  2. 配置AWS CLI 以使用默认安全凭证和默认 AWS 区域。

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

    aws s3 同步 s3://yourbucketname 本地路径

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

于 2019-05-04T14:36:16.663 回答
5

在 Windows 中,我首选的 GUI 工具是CloudBerry Explorer Freeware for Amazon S3。它有一个相当精致的文件浏览器和类似 FTP 的界面。

于 2013-10-29T03:15:30.797 回答
4

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

于 2016-02-05T23:16:46.970 回答
3

试试这个命令:

aws s3 sync yourBucketnameDirectory yourLocalDirectory

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

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

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

于 2019-03-08T11:03:01.927 回答
2
  1. Windows 用户需要从此链接下载 S3EXPLORER,该链接也有安装说明:- http://s3browser.com/download.aspx

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

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

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

铲斗选择屏幕

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

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

于 2016-07-22T12:49:55.493 回答
2

aws sync 是完美的解决方案。它没有两种方式..它是从源到目的地的一种方式。此外,如果您的存储桶中有很多项目,最好先创建 s3 端点,以便下载速度更快(因为下载不是通过 Internet 而是通过 Intranet)并且不收费

于 2017-01-26T10:55:09.683 回答
2

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

aws s3 presign s3://<your_bucket_name/>

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

于 2018-09-24T03:59:34.523 回答
2

你只需要通过 --recursive & --include "*"

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

于 2020-06-19T07:32:44.853 回答
2

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

aws s3 sync s3://bucketname/ .
于 2020-10-01T19:46:13.727 回答
2

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

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

s5cmd支持通配符,所以这样的东西可以工作:

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

于 2021-06-02T01:42:10.023 回答
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.");
}

}

于 2017-06-23T15:48:03.783 回答
1

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

s3cmd get --recursive --continue s3://test-bucket local-directory/
于 2018-05-13T19:31:30.100 回答
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> 
于 2018-06-11T10:07:49.463 回答
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),请小心,这可能会影响您的账单,请先计算成本

于 2019-06-24T08:06:11.520 回答
1

以下是复制整个存储桶所需执行的操作的摘要:

1.创建一个可以操作AWS s3 bucket的用户

关注这篇官方文章:https ://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html 不要忘记:

  • 勾选“程序访问”,以便有可能通过 CLI 处理 AWS。
  • 向您的用户添加正确的 IAM 策略以允许他与 s3 存储桶进行交互

2. 下载、安装和配置 AWS CLI

请参阅允许对其进行配置的链接:https ://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html

您可以使用以下命令来添加您在创建用户时获得的密钥:

$ aws configure
AWS Access Key ID [None]: <your_access_key>
AWS Secret Access Key [None]: <your_secret_key>
Default region name [None]: us-west-2
Default output format [None]: json

3.使用以下命令下载内容

您可以递归cp命令,但aws sync命令是 f:

aws s3 sync s3://your_bucket /local/path

例如,以下命令将显示.png存储桶中存在的所有文件。重播命令而不--dryrun下载生成的文件。

aws s3 sync s3://your_bucket /local/path --recursive --exclude "*" --include "*.png" --dryrun
于 2021-08-30T08:29:53.153 回答
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 证书的默认行为。 参考

将此标签与命令--no-verify-ssl一起使用

aws s3 sync s3://your-bucket-name "Local Folder Path" --no-verify-ssl
于 2019-06-19T23:59:18.340 回答
0

使用 boto3 下载具有特定前缀的存储桶中的所有对象

import boto3

s3 = boto3.client('s3', region_name='us-east-1', 
                     aws_access_key_id=AWS_KEY_ID, 
                     aws_secret_access_key=AWS_SECRET)

def get_all_s3_keys(bucket,prefix):
    keys = []

    kwargs = {'Bucket': bucket,Prefix=prefix}
    while True:
        resp = s3.list_objects_v2(**kwargs)
        for obj in resp['Contents']:
             keys.append(obj['Key'])

        try:
            kwargs['ContinuationToken'] = resp['NextContinuationToken']
        except KeyError:
            break

        return keys

def download_file(file_name, bucket,key):
    file=s3.download_file(
    Filename=file_name,
    Bucket=bucket,
    Key=key)
    return file

bucket="gid-folder"
prefix="test_"
keys=get_all_s3_keys(bucket,prefix):

for key in keys:
     download_file(key, bucket,key)
   
 
于 2021-09-13T22:11:27.537 回答