我注意到似乎没有从AWS管理控制台下载整个s3存储桶的选项。
s3
有没有一种简单的方法来获取我的一个存储桶中的所有内容?我在考虑将根文件夹设为公共文件夹,使用wget来获取所有内容,然后再次将其设为私有,但我不知道是否有更简单的方法。
wget
我已经为S3做了一些开发,但我还没有找到下载整个存储桶的简单方法。
如果您想在Java中编码,jets3t lib很容易用于创建存储桶列表并遍历该列表以下载它们。
首先,从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之后,“下载整个存储桶”可以做你想做的事情。
您可以使用s3cmd下载您的存储桶:
s3cmd
s3cmd --configures3cmd sync s3://bucketnamehere/folder /destination/folder
您可以使用另一个名为rclone的工具。这是Rclone留档中的代码示例:
rclone
rclone sync /home/local/directory remote:bucket
如果您将Firefox与S3Fox一起使用,这确实可以让您选择所有文件(Shift-选择第一个和最后一个)并右键单击并下载所有文件。
我已经完成了500多个文件,没有任何问题。
我使用了几种不同的方法将Amazon S3数据复制到本地机器,包括s3cmd,到目前为止最简单的方法是赛博鸭。
您只需输入您的Amazon凭据,并使用简单的界面下载、上传、同步您的任何存储桶、文件夹或文件。
对于Windows,s3浏览器是我找到的最简单的方法。它是优秀的软件,并且可以免费用于非商业用途。
有关更多信息,请参阅“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中的所有对象下载到当前目录。
mybucket
并将输出:
download: s3://mybucket/test.txt to test.txtdownload: s3://mybucket/test2.txt to test2.txt
这将使用单向同步下载所有文件。除非您指定 #0,否则它将没有删除当前目录中的任何现有文件,并且它不会更改或删除S3上的任何文件。
您还可以执行S3存储桶到S3存储桶,或本地到S3存储桶同步。
看看留档及其他例子。
虽然上面的示例是如何下载完整的存储桶,但您也可以通过执行递归下载文件夹
aws s3 cp s3://BUCKETNAME/PATH/TO/FOLDER LocalFolderName --recursive
这将指示CLI在BUCKETNAME存储桶中的PATH/TO/FOLDER目录中递归下载所有文件和文件夹密钥。
BUCKETNAME
PATH/TO/FOLDER
另一个可以帮助一些OS X用户的选项是传输。
它是一个FTP程序,还可以让您连接到S3文件。而且,它可以选择将任何FTP或S3存储挂载为Finder中的文件夹,但仅限时间。
当在Windows中,我的首选GUI工具是CloudBerry Explorer Freeware forAmazon S3。它有一个相当精致的文件资源管理器和类似FTP的界面。
如果您使用Visual Studio,请下载“适用于Visual Studio的AWS Toolkit”。
安装后,转到Visual Studio-AWS Explorer-S3-您的存储桶-双击
在窗口中,您将能够选择所有文件。右键单击并下载文件。
您可以使用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版本下发布。
mc
如果您只有文件(没有子目录),快速解决方案是选择所有文件(第一个是click,最后一个是Shift+click),然后点击Enter或right click并选择Open。对于大多数数据文件,这将直接下载到您的计算机。
click
Shift+click
Enter
right click
Open
Windows用户需要从这个链接下载S3EXPLORER,该链接也有安装说明:-http://s3browser.com/download.aspx
然后为您提供AWS凭据,如秘密密钥、访问密钥和区域到s3Explorer,此链接包含s3Explorer的配置说明:在浏览器中复制粘贴链接:s3browser.com/s3browser-first-run.aspx
现在,您的所有s3存储桶将在s3Explorer的左侧面板上可见。
只需选择存储桶,然后单击左上角的存储桶菜单,然后从菜单中选择下载所有文件到选项。下面是相同的屏幕截图:
桶选择屏幕
然后浏览文件夹以在特定位置下载存储桶
单击OK,您的下载将开始。
将此命令与AWS CLI一起使用:
aws s3 cp s3://bucketname . --recursive
AWS同步是完美的解决方案。它不是双向的…它是从源到目标的单向。此外,如果您在桶中有很多项目,最好先创建s3端点,以便下载更快(因为下载不是通过互联网而是通过内部网进行的)并且不收费
要使用AWS S3 CLI下载:
aws s3 cp s3://WholeBucket LocalFolder --recursiveaws s3 cp s3://Bucket/Folder LocalFolder --recursive
要使用代码下载,请使用AWS SDK。
要使用GUI下载,请使用CyberDuck。
这里有一些东西下载所有桶,列出它们,列出它们的内容。
//connection stringprivate 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())){//DOWNLOADtry{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 downloadpublic static void unzipBucket() throws IOException {unzip = new UnZipBuckets();unzip.unZipIt(app.getDownloadedBucket());System.out.println(CONST.getFileUnzippedMessage());} //list all S3 bucketspublic 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 bucketpublic 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.");}
}
您有很多选择,但最好的选择是使用AWS CLI。
下面是一个走通:
在您的计算机上下载并安装AWS CLI:
配置AWS CLI:
确保您输入了有效的访问和秘密密钥,这是您在创建帐户时收到的。
使用以下命令同步S3存储桶:
aws s3 sync s3://yourbucket /local/path
在上面的命令中,替换以下字段:
yourbucket
/local/path
@Layke的回答很好,但是如果你有大量的数据并且不想永远等待,你应该读“AWS CLI S3配置”。
以下命令将告诉AWS CLI使用1,000个线程来执行作业(每个线程是一个小文件或多部分副本的一部分),并展望100,000个作业:
aws configure set default.s3.max_concurrent_requests 1000aws configure set default.s3.max_queue_size 100000
运行这些之后,您可以使用简单的sync命令:
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倍。
您可以简单地使用s3cmd命令获取它:
s3cmd get --recursive --continue s3://test-bucket local-directory/
正如Neel Bhaat在本博客中解释的那样,有许多不同的工具可用于此目的。有些是AWS提供的,其中大多数是第三方工具。所有这些工具都要求您将AWS帐户密钥和机密保存在工具本身中。使用第三方工具时要非常小心,因为您保存的凭据可能会花费您的全部价值并使您死亡。
因此,我始终建议为此使用AWS CLI。您可以简单地从此链接安装它。接下来,运行以下命令并将您的密钥、机密值保存在AWS CLI中。
aws configure
并使用以下命令将您的AWS S3 Bucket同步到您的本地计算机。(本地计算机应安装AWS CLI)
aws s3 sync <source> <destination>
示例:
1)AWS S3到本地存储
aws s3 sync <S3Uri> <LocalPath>
从本地存储到AWS S3
aws s3 sync <LocalPath> <S3Uri>
3)从AWS s3存储桶到另一个存储桶
aws s3 sync <S3Uri> <S3Uri>
如果您只想从AWS下载存储桶,请首先在您的机器上安装AWS CLI。在终端中将目录更改为您要下载文件的位置并运行此命令。
aws s3 sync s3://bucket-name .
如果您还想同步本地和s3目录(如果您在本地文件夹中添加了一些文件),请运行以下命令:
aws s3 sync . s3://bucket-name
正如@layke所说,从S3 cli下载文件是最好的做法,它是安全可靠的。但在某些情况下,人们需要使用wget来下载文件,这里是解决方案
aws s3 presign s3://<your_bucket_name/>
这将预签名将为您提供临时公共URL,您可以使用presign_url从S3下载内容,在您的情况下使用wget或任何其他下载客户端。
AWS sdk API将仅是将整个文件夹和repo上传到s3并将整个s3存储桶下载到本地的最佳选项。
用于将整个文件夹上传到s3
aws s3 sync . s3://BucketName
用于在本地下载整个s3存储桶
aws s3 sync s3://BucketName .
您还可以为s3中的特定文件夹分配路径如BucketName/Path以供下载
试试这个命令:
aws s3 sync yourBucketnameDirectory yourLocalDirectory
例如,如果您的存储桶名称为myBucket,本地目录为c:\local,则:
myBucket
c:\local
aws s3 sync s3://myBucket c:\local
有关awscli的更多信息,请查看此aws cli安装
要添加另一个GUI选项,我们使用WinSCP的S3功能。它非常容易连接,只需要您在UI中的访问密钥和密钥。然后,您可以从任何可访问的存储桶浏览和下载所需的任何文件,包括嵌套文件夹的递归下载。
由于通过安全性清除新软件可能是一个挑战,并且WinSCP相当普遍,因此仅使用它而不是尝试安装更专业的实用程序可能会非常有益。
AWS CLI是在本地下载整个S3存储桶的最佳选择。
安装AWS CLI。
配置AWS CLI以使用默认安全凭据和默认AWS区域。
要下载整个S3存储桶使用命令
aws s3 sync s3://你的桶名本地路径
参考将AWS cli用于不同的AWS服务:https://docs.aws.amazon.com/cli/latest/reference/
您可以使用此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)
默认情况下,AWS CLI在与AWS服务通信时使用SSL。对于每个SSL连接,AWS CLI将验证SSL证书。此选项覆盖验证SSL证书的默认行为。参考
将此标记与命令一起使用
aws s3 sync s3://your-bucket-name "Local Folder Path" --no-verify-ssl
如果存储桶很大,则有一个名为s4cmd的命令,它可以进行并行连接并缩短下载时间:
s4cmd
将其安装在Debian上,如
apt install s4cmd
如果你有pip:
pip install s4cmd
如果存在,它将读取~/.s3cfg文件(如果没有安装s3cmd并运行s3cmd --configure),或者您可以在命令上指定--access-key=ACCESS_KEY --secret-key=SECRET_KEY。
~/.s3cfg
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),请小心,这可能会影响您的账单,首先计算成本
你只需要传递--递归&--包括"*"
aws --region "${BUCKET_REGION}" s3 cp s3://${BUCKET}${BUCKET_PATH}/ ${LOCAL_PATH}/tmp --recursive --include "*" 2>&1
使用awscli将文件下载/上传到s3总是更好的。同步将帮助您轻松恢复。
aws s3 sync s3://bucketname/ .
100%为我工作,我已经从aws s3 backet下载了所有文件。
安装aws cli(并选择您的操作系统,按照步骤操作)https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html
查看aws版本:aws --version
aws --version
aws s3 cp s3://yourbucketname your\local\path --recursive
例如(WindowsOS):aws s3 cp s3://yourbucketname C:\aws-s3-backup\project-name --recursive
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
除了aws s3 sync的建议外,我还建议查看s5cmd(https://github.com/peak/s5cmd)。
aws s3 sync
s5cmd
根据我的经验,我发现对于多次下载或大型下载,这比AWS CLI快得多。
s5cmd支持通配符,所以这样的东西可以工作:
s5cmd cp s3://bucket-name/* ./folder
以下是复制整个存储桶所需执行的操作的摘要:
关注这篇官方文章:https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html别忘了:
查看此链接允许配置它:https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html
您可以使用以下命令来添加您在创建用户时获得的密钥:
$ aws configureAWS Access Key ID [None]: <your_access_key>AWS Secret Access Key [None]: <your_secret_key>Default region name [None]: us-west-2Default output format [None]: json
您可以使用递归的cp命令,但aws sync命令是f:
cp
aws sync
aws s3 sync s3://your_bucket /local/path
--dryrun
max_concurrent_requests
max_queue_size
--exclude
--include
例如,下面的命令将显示存储桶中呈现的所有.png文件。重放不带--dryrun的命令以下载生成的文件。
.png
aws s3 sync s3://your_bucket /local/path --recursive --exclude "*" --include "*.png" --dryrun
使用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)
您可以使用sync下载整个S3存储桶。例如,要在当前目录下下载名为bucket1的整个存储桶。
aws s3 sync s3://bucket1 .
是一个很好的答案,但如果对象在储存类别Glacier Flexible Retriava中,即使文件已恢复,它也不会起作用。在这种情况下,您需要添加标志--force-glacier-Transfer。