ChatGPT解决这个技术问题 Extra ChatGPT

下载整个 S3 存储桶?

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

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

正如这里的许多人所说,aws s3 sync 是最好的。但是没有人指出一个强大的选项:dryrun。此选项允许您查看在使用 sync 时将从 s3 下载/上传到 s3 的内容。当您不想覆盖本地或 s3 存储桶中的内容时,这非常有用。这是如何使用的:aws s3 sync <source> <destination> --dryrun 在将新内容推送到存储桶之前,我一直使用它,以免上传不需要的更改。
这是一个演示 aws s3 sync 在实践中的快速视频:youtube.com/watch?v=J2aZodwPeQk
请参阅 2021/09 完整答案:stackoverflow.com/a/68981037/8718377

t
the Tin Man

AWS CLI

有关详细信息,请参阅“AWS CLI Command Reference”。

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 存储桶同步。

查看 documentation and other examples

而上面的例子是如何下载一个完整的桶,你也可以通过执行递归下载一个文件夹

aws s3 cp s3://BUCKETNAME/PATH/TO/FOLDER LocalFolderName --recursive

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


首先运行 aws configure 并添加您的 access keysecret access key,它们可以在 here 中找到。
转到此处获取 Windows 安装程序 aws.amazon.com/cli。它从环境变量“AWS_ACCESS_KEY_ID”中获取访问密钥 ID,并从“AWS_SECRET_ACCESS_KEY”中获取您的密钥。
我已经尝试过 s3cmdCyberduck,但对我来说,awscli 是迄今为止从我的存储桶下载约 70.000 个文件的最快方法。
请注意,虽然问题仅询问下载,但我相信此命令将在您的目录和 S3 之间进行双向同步。如果您不尝试上传任何内容,请确保当前目录为空。
@JesseCrossen 该 aws s3 sync 命令不会上传任何内容,但如果文件在 S3 上不存在,它将在本地删除文件。请参阅the documentation
t
the Tin Man

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

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

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

rclone sync /home/local/directory remote:bucket

这很慢。特别是如果您尝试增量使用它。是否有一个多线程的解决方案可以使带宽饱和?
下面的解决方案更好,更标准,对更多平台开放
这不适用于请求者支付桶(请参阅 arxiv.org/help/bulk_data_s3):-(
如果我必须为下载执行模式匹配,我该如何使用您的解决方案?我的问题:stackoverflow.com/questions/25086722/…
t
the Tin Man

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

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

https://i.stack.imgur.com/6WUiA.png


效果很好!适用于 Windows 和 Mac (GPL)。
Cyberduck 还可以轻松匿名下载公共文件 - s3cmd 似乎需要凭据
也适用于 Transmit。
当我试图保存我的存储桶时,CLI 给了我一个错误,这非常有效!
哦,这出乎意料。我之前使用cyberduck 进行FTP,但从没想过它有S3 连接。感谢您的精彩提示!
t
the Tin Man

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

这是一个演练:

在您的机器上下载并安装 AWS CLI:使用 MSI 安装程序 (Windows) 安装 AWS CLI。使用适用于 Linux、OS X 或 Unix 的捆绑安装程序安装 AWS CLI。配置 AWS CLI:确保输入您在创建账户时收到的有效访问密钥和密钥。使用以下命令同步 S3 存储桶: aws s3 sync s3://yourbucket /local/path 在上述命令中,替换以下字段:yourbucket >> 您要下载的 S3 存储桶。 /local/path >> 本地系统中要下载所有文件的路径。


我用这个代替了cyberduck,因为cyberduck 需要在开始下载之前“准备”文件。对于似乎需要很长时间的大量文件,我找不到有关“准备”实际作用的信息。 CLI 立即开始下载
确保您在存储桶名称中有那个 s3:// 前缀!!!使用 aws s3 ls 您不需要 s3:// 前缀,但需要 cp 命令。
t
the Tin Man

使用 AWS S3 CLI 下载:

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

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

要使用 GUI 下载,请使用 Cyberduck。


如何忽略某些文件或文件夹?
@Nabin 你可以使用 --include & --exclude 使用通配符排除某些文件或文件夹,例如:aws s3 cp s3://my-bucket-name ./local-folder --recursive --include "*" --exclude "excludeFolder/*" --exclude "includeFolder/excludeFile.txt"
t
the Tin Man

@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

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


这是真正的答案。刚刚测试过,从 ec2 传输大约 2.3GB/分钟。没有大约 1GB/分钟的并发选项。救生员。
这很棒!另一个提示:要为非默认配置文件配置这些值,不要简单地将 default 替换为 profile-name。而是使用这个:aws configure set s3.max_concurrent_requests 1000 --profile profile-name
t
the Tin Man

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

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

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


N
Najathi

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

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

https://i.stack.imgur.com/Lnjoq.jpg

运行配置命令:aws configure

https://i.stack.imgur.com/NyQvd.jpg

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

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

https://i.stack.imgur.com/wO2xk.jpg

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


谢谢,它会维护存储桶内的文件夹结构吗?
谢谢!像魅力一样工作。
t
the Tin Man

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


我刚刚尝试了“将所有文件下载到...”选项(我认为这相当于“下载整个 s3 存储桶”,它说我需要专业版。
更新:但我能够下载存储桶中的整个文件夹,这足以满足我的需要......
是的,免费版本非常有限,您可以选择全部并下载,但仅限于同时传输 2 个
在 Ubuntu 17.1 和 s3cmd 上遇到一些 python3 支持错误后,正在寻找 Windows 简单版本,这很好用。
j
jedierikb

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

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

A
Abdullah Khawer

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

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


t
the Tin Man

我已经为 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 后,“Downloading the whole bucket”可能会做你想做的事。


除非您需要 Java 解决方案,否则请使用上面的 aws cli 答案。
创建一个新文件夹等等
H
Harsh Manvar

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

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

aws s3 sync . s3://BucketName

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

aws s3 sync s3://BucketName . 

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


D
DiligentKarma

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


M
Muzammil

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

aws s3 sync s3://bucket-name .

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

aws s3 sync . s3://bucket-name

b
bsplosion

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

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


s
singh30

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

安装 AWS CLI。配置 AWS CLI 以使用默认安全凭证和默认 AWS 区域。要下载整个 S3 存储桶,请使用命令 aws s3 sync s3://yourbucketname localpath

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


A
Abdullah Khawer

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

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


这不适用于存储桶中的子文件夹,即使“伪文件夹”是在 AWS 控制台中创建的。 (截至撰写此评论)
确认不工作,我有大约 12k 顶级键 = 子文件夹),S3Fox 甚至没有启动。还要坚持列出所有桶的权限!
A
Abdullah Khawer

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


L
Lukasz Czerwinski

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


p
pheeleeppoo

试试这个命令:

aws s3 sync yourBucketnameDirectory yourLocalDirectory

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

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

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


这件艺术品的作品!这个答案链接,我马上收藏了。谢谢!
P
Patrick R

Windows 用户需要从此链接下载 S3EXPLORER,该链接也有安装说明:- http://s3browser.com/download.aspx 然后为您提供 AWS 凭证,如 s3explorer 的密钥、访问密钥和区域,此链接包含 s3explorer 的配置说明:在浏览器中复制粘贴链接:s3browser.com/s3browser-first-run.aspx 现在您的所有 s3 存储桶都将显示在 s3explorer 的左侧面板上。只需选择存储桶,然后单击左上角的存储桶菜单,然后从菜单中选择将所有文件下载到选项。以下是相同的屏幕截图:

Bucket Selection Screen

然后浏览文件夹以在特定位置下载存储桶 单击确定,您的下载将开始。


D
Deepak Singhal

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


B
Balaji JB

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

aws s3 presign s3://<your_bucket_name/>

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


P
Praveen Gowda

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

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


J
Jobin Joseph

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

aws s3 sync s3://bucketname/ .

这个答案有什么新东西?
w
wrschneider

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

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

s5cmd 支持通配符,因此可以使用以下方法:

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


s5cmd 使用 golang 比 awscli joshua-robinson.medium.com/… 快 10 倍
是的,我不完全理解 AWS CLI 中的限制因素,或者为什么 Golang 比 Python 快得多(也许是 Python GIL 限制了多线程?)
u
user1445267

您可以使用同步下载整个 S3 存储桶。例如,要在当前目录下载名为 bucket1 的整个存储桶。

aws s3 sync s3://bucket1 .

J
John Hanewich

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

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

}


H
Hubbitus

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

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

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅