下载整个S3存储桶?

1065

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

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


17
就像这里的许多人所说,“aws s3 sync”是最好的选择。但没有人指出一个强大的选项:“dryrun”。这个选项允许您在使用“sync”时查看将从S3下载/上传什么内容。当您不想覆盖本地或S3存储桶中的内容时,这非常有帮助。这是它的使用方法:“aws s3 sync <source> <destination> --dryrun”。我通常在将新内容推送到存储桶之前一直使用它,以避免上传不需要的更改。 - Perimosh
这是一个快速视频,展示了aws s3 sync的实际应用:https://www.youtube.com/watch?v=J2aZodwPeQk - Dennis Traub
请查看 2021/09 的完整答案:https://dev59.com/RGoy5IYBdhLWcg3wQ8AF#68981037 - veben
仅限于字面下载... aws s3 cp s3://Bucket/Folder LocalFolder --recursive - DanielBell99
39个回答

1904

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
这将使用单向同步下载所有文件。除非您指定 --delete ,否则它不会删除当前目录中的任何现有文件,并且不会更改或删除S3上的任何文件。 您还可以执行S3存储桶到S3存储桶或本地到S3存储桶的同步。 请查看文档和其他示例。 虽然上面的示例是如何下载完整存储桶,但您也可以通过执行递归文件夹来下载文件夹。
aws s3 cp s3://BUCKETNAME/PATH/TO/FOLDER LocalFolderName --recursive
这将指示CLI递归下载BUCKETNAME存储桶中PATH/TO/FOLDER目录内的所有文件和文件夹密钥。

310
首先运行 aws configure 并添加您的 访问密钥秘密访问密钥,这些可以在 此处 找到。 - user2609980
13
这里是 Windows 安装程序的下载链接 http://aws.amazon.com/cli/。它会从环境变量 "AWS_ACCESS_KEY_ID" 中获取访问密钥 ID,并从 "AWS_SECRET_ACCESS_KEY" 中获取您的秘密密钥。 - Matt Bond
10
我尝试过使用s3cmdCyberduck,但对我来说,使用awscli是从我的桶(bucket)下载大约70,000个文件最快的方法。 - Arjen
14
请注意,虽然问题只涉及下载,但我认为这个命令将在您的目录和 S3 之间进行双向同步。如果您不想上传任何内容,请确保当前目录为空。 - Jesse Crossen
20
@JesseCrossen 这个 aws s3 sync 命令不会上传任何东西,但如果本地文件在 S3 上不存在,它将会删除这些文件。请参考文档 - Flimm
显示剩余20条评论

196

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

s3cmd --configure
s3cmd sync s3://bucketnamehere/folder /destination/folder
还有另一种工具可以使用,叫做rclone。这是Rclone文档中的代码示例:
rclone sync /home/local/directory remote:bucket

6
这很慢,特别是当你尝试逐步使用它时。是否有一种多线程的解决方案,可以充分利用带宽? - Peter Lada
以下的解决方案更好、更标准,并且适用于更多平台。 - abc123
这对于请求者付费的存储桶不起作用(请参见http://arxiv.org/help/bulk_data_s3):-( - Martin Thoma
如果我需要执行模式匹配来下载文件,我该如何使用您的解决方案? 我的问题链接:https://dev59.com/ol8f5IYBdhLWcg3wD_Av#25087286 - Shrikant Kakani

122

我使用过几种不同的方法将亚马逊 S3 数据复制到本地机器,包括 s3cmd ,但到目前为止,最简单的方法是使用Cyberduck

你只需要输入你的亚马逊凭证并使用简单的界面来下载、上传、同步你的任何存储桶、文件夹或文件即可。

截图


非常好用!适用于Windows和Mac(GPL)。 - craastad
Cyberduck还可以轻松地匿名下载公共文件,而s3cmd似乎需要凭据。 - chrishiestand
当我尝试保存我的存储桶时,CLI 给了我一个错误,但这个方法完美地解决了问题! - Lazar Kukolj
哦,这出乎意料。我之前用Cyberduck进行FTP,但从未想过它也可以连接S3。感谢您提供的绝佳提示! - jskierbi
如果一个存储桶中有超过60,000个文件夹,Cyberduck会崩溃。 - Duna
显示剩余4条评论

93

您有很多选项可以完成这个任务,但最好的方法是使用 AWS CLI。

以下是一些步骤:

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

  2. 配置 AWS CLI:

    enter image description here

    请确保您输入了有效的访问秘密密钥,这些密钥在创建帐户时收到。

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

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

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

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

1
我使用了CLI而不是Cyberduck,因为Cyberduck需要在开始下载之前“准备”文件。对于大量的文件来说,这似乎需要很长时间,而且我找不到有关“准备”实际上是什么的信息。CLI立即开始下载。 - Tashows
1
确保您在桶名中包含s3://前缀!!!使用aws s3 ls命令时,您不需要该s3://前缀,但cp命令需要。 - cjmling

77

使用AWS S3 CLI下载:

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

要使用代码下载,请使用AWS SDK。

要使用图形界面下载,请使用Cyberduck。


1
如何忽略某些文件或文件夹? - Nabin
5
@Nabin,你可以使用通配符结合 --include 和 --exclude 来排除一些文件或文件夹,例如:aws s3 cp s3://my-bucket-name ./local-folder --recursive --include "*" --exclude "excludeFolder/*" --exclude "includeFolder/excludeFile.txt" - DarkCenobyte
看起来在使用这个命令时,无法根据用户定义的“元数据”值来排除或包含文件,即如果某个元数据键值等于“值” => 不下载。正确吗? - undefined

55

@Layke的回答很好,但如果您有大量数据并且不想等待太久,您应该阅读“AWS CLI S3 Configuration”。

以下命令将告诉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

在一个拥有4核CPU和16GB RAM的系统上,对于像我这样(3-50GB文件)的情况,同步/复制速度从大约9.5MiB/s提高到了700+MiB/s,相比默认配置提高了70倍。


6
这就是真正的答案。我刚测试过,从EC2传输速度约为每分钟2.3GB。如果没有并发选项,则大约为1GB/min。真救命。 - Karsten
1
太好了!另一个提示:如果要为非默认配置文件配置这些值,请不要简单地将“default”替换为“profile-name”。而是使用以下命令:aws configure set s3.max_concurrent_requests 1000 --profile profile-name - Pravin Singh
这些设置导致我的浏览器崩溃,并停止了在我的MacBook Air M1 16GB内存上的下载。不得不将它们降低一点。 - Christopher Reid
@ChristopherReid,大文件下载导致浏览器崩溃并不奇怪,这些设置本来就不应该影响浏览器。如果要下载任何大型文件夹,您需要使用CLI或专门的程序。 - James
@James 我之前一直在使用 cli 同步命令进行下载。我正在下载大约 90GB 的数据。当我以这些设置进行同步时,我的浏览器标签页(火狐)一直崩溃。我将您建议的每个设置减少一位数之后运行良好,但显然速度较慢。 - Christopher Reid

45

对我来说百分之百有效,我已经从AWS S3存储桶下载了所有文件。

  1. 安装AWS CLI。选择您的操作系统并按照此处的步骤进行操作:安装或更新最新版本的AWS CLI

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

enter image description here

  1. 运行配置命令:aws configure

enter image description here

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

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

enter image description here

请查看此链接:如何将S3存储桶中的所有内容下载到本地文件夹

1
谢谢,它会保持存储桶内的文件夹结构吗? - I. Afrin
1
谢谢!运行得非常顺利。 - McCrockett

30
如果您使用Visual Studio,请下载“AWS Toolkit for Visual Studio”。 安装完成后,进入Visual Studio - AWS Explorer - S3 - 您的存储桶 - 双击。 在窗口中,您可以选择所有文件。右键单击并下载文件。

26

对于Windows来说,我发现S3 Browser是最简单的方式。它是优秀的软件,且非商业使用免费。


4
我刚刚尝试了“全部下载到...”选项(我认为这相当于“下载整个S3存储桶”),但它说我需要Pro版本。 - Jack Ukleja
3
更新:但我成功地下载了存储桶中的整个文件夹,这对我的需求足够了... - Jack Ukleja
是的,免费版本相当有限,您可以选择全部并下载,但仅限于同时进行2个传输。 - Hayden Thring
在Ubuntu 17.1和s3cmd上遇到了一些Python3支持错误后,我正在寻找一个Windows简化版本,这个很好用。 - edencorbin

21

使用AWS CLI命令:

aws s3 cp s3://bucketname . --recursive

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,