使用 awscli 恢复中断的 s3 下载
Resuming interrupted s3 download with awscli
我正在使用 awscli 下载文件:
$ aws s3 cp s3://mybucket/myfile myfile
但是下载中断了(电脑进入休眠状态)。我怎样才能继续下载? S3 支持范围 header,但 awscli s3 cp
不允许我指定它。
该文件不可公开访问,因此我无法使用 curl 手动指定 header。
awscli 工具中有一个 "hidden" 命令,它允许对 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/2
和 2>
),但是如果发生错误,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
似乎提供 multi-threaded 功能,同时保持 s3cmd
的可用性特征:
我正在使用 awscli 下载文件:
$ aws s3 cp s3://mybucket/myfile myfile
但是下载中断了(电脑进入休眠状态)。我怎样才能继续下载? S3 支持范围 header,但 awscli s3 cp
不允许我指定它。
该文件不可公开访问,因此我无法使用 curl 手动指定 header。
awscli 工具中有一个 "hidden" 命令,它允许对 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/2
和 2>
),但是如果发生错误,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
似乎提供 multi-threaded 功能,同时保持 s3cmd
的可用性特征: