使用awscli恢复中断的s3下载

hra*_*ban 12 amazon-s3 resume-download aws-cli

我正在使用awscli下载文件:

$ aws s3 cp s3://mybucket/myfile myfile
Run Code Online (Sandbox Code Playgroud)

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

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

hra*_*ban 10

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.
Run Code Online (Sandbox Code Playgroud)

以下是继续下载的方法:

$ 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
Run Code Online (Sandbox Code Playgroud)

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

$ aws s3api get-object \
            --bucket mybucket \
            --key myfile \
            --range "bytes=$size-" \
            /dev/fd/3 3>&1 >&2 | pv >> myfile
Run Code Online (Sandbox Code Playgroud)

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

†在git说话,s3是瓷器,并且s3api是plubming.


Dav*_*rks 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 ./
Run Code Online (Sandbox Code Playgroud)

请注意,在awscli多线程的情况下,S3 cmd 不是多线程的,例如awscli更快。甲当前维护叉s3cmd,称为s4cmd出现以提供多线程功能,同时保持可用性的功能s3cmd

https://github.com/bloomreach/s4cmd

  • s4cmd(仍然)不支持“—继续” (2认同)