使用 awscli 恢复中断的 s3 下载



我正在使用 awscli 下载一个文件:

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

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

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

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 在操作结束时将调试消息写入 stdout,从而污染了您的文件。此解决方案将 stdout 重新绑定到 stderr,并通过别名释放常规文件内容的管道。没有pv的版本在技术上可以写入stderr(/dev/fd/22>(,但如果发生错误,s3api写入stderr,然后附加到您的文件中。因此,在那里使用专用管道也更安全。

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

使用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更快。当前维护s3cmd分支,称为s4cmd,似乎提供了多线程功能,同时保持了s3cmd的可用性特性:

https://github.com/bloomreach/s4cmd

最新更新