簡體   English   中英

使用 awscli 恢復中斷的 s3 下載

[英]Resuming interrupted s3 download with awscli

我正在使用 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM