18

我正在使用 awscli 下载文件:

$ aws s3 cp s3://mybucket/myfile myfile

但下载被中断(计算机进入睡眠状态)。如何继续下载?S3 支持 Range 标头,但awscli s3 cp不允许我指定它。

该文件不可公开访问,因此我无法使用 curl 手动指定标题。

4

2 回答 2

19

awscli 工具中有一个“隐藏”命令,它允许对 S3 进行较低级别的访问:s3api.† 它对用户不太友好(没有 s3:// URL 和进度条),但它确实支持范围说明符get-object

   --range  (string) Downloads the specified range bytes of an object. For
   more   information   about   the   HTTP    range    header,    go    to
   http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.

以下是继续下载的方法:

$ size=$(stat -f%z myfile) # assumes OS X. Change for your OS
$ aws s3api get-object \
            --bucket mybucket \
            --key myfile \
            --range "bytes=$size-" \
            /dev/fd/3 3>>myfile

您可以将pv用作基本进度条:

$ aws s3api get-object \
            --bucket mybucket \
            --key myfile \
            --range "bytes=$size-" \
            /dev/fd/3 3>&1 >&2 | pv >> myfile

(这个未命名管道的麻烦的原因是 s3api 在操作结束时将调试消息写入标准输出,污染您的文件。此解决方案将标准输出重新绑定到标准错误并通过别名为常规文件内容释放管道。没有的版本pv技术上可以写入标准错误(/dev/fd/22>),但如果发生错误,s3api 会写入标准错误,然后会附加到您的文件中。因此,在那里使用专用管道也更安全。)

† 在 git speak 中,s3是瓷器,s3api是管道。

于 2017-07-12T23:04:43.990 回答
8

使用s3cmd它具有--continue内置的功能。示例:

# Start a download
> s3cmd get s3://yourbucket/yourfile ./
download: 's3://yourbucket/yourfile' -> './yourfile' [1 of 1]
    123456789 of 987654321     12.5% in 235s   0.5 MB/s

[ctrl-c] interrupt

# Pick up where you left off
> s3cmd --continue get s3://yourbucket/yourfile ./

请注意,S3 cmd 不是多线程的,awscli它是多线程的,例如awscli更快。当前维护的一个名为的分支似乎提供了多线程功能,同时保持了以下的可用性特性:s3cmds4cmds3cmd

https://github.com/bloomreach/s4cmd

于 2019-05-14T20:09:18.643 回答