curl 分段下載與分段合併

Debian 有很多實用的工具如: apt 系列 、 update- 系列,但是我們卻常常忽略了!這個版就是要大家一起來分享您在使用 debian 特殊指令的經驗!請大家共襄盛舉囉!注意不要在此提問問題喔!

curl 分段下載與分段合併

文章yjchen » 週三 4月 16, 2008 10:01 pm

合併

我們已經分段下載好的檔案,必須按照順序接回來。
但是以下情形不能使用 shell 提供的展開 cat file.part* > file,因為排序不一致,如:
我們有 part1 ~ part12,但是開頭排的列可能是:
代碼: 選擇全部
part1
part10
part11
part12
part2
..


稍微找了一下 sort 似乎不可行,我想應該是 -k 吧,但是怎麼看都不太會,稍微看了一下 ls 的排序
ls -v
似乎可以勉強解決這樣的問題。
cat $(ls -v part*) > merge
不知道有沒有其他更好的方式。

curl 分段下載

curl -r <這裡可指定範圍>
單位為 byte。

先用 curl -I 取得檔案資訊,以 http 為例,回傳 header 其中就包含 Content-Length: <這就是檔案大小>。

這樣就可以指定分段的檔案範圍了,值得注意的範圍是由 0 開始數,所以 10 bytes 大小的檔案,範圍應該要在 0-9 才對。我們分兩段也就是 0-4、5-9 的範圍,分別有 4 bytes。

這下好了,我們有一個 100M bytes 大小的檔案,可能會算到頭大。我們可能很直覺的想要分 n 段下載。所以我這寫了一小段沒頭沒腦的的 shell script:
代碼: 選擇全部
#!/bin/sh
if [ ! $2 ]
then
  echo "Usage: $0 <n_part> <file>"
  exit 1
fi

SZ_FILE=$(curl -I "$2" 2> /dev/null | grep "Content-Length: " | sed 's/Content-Length: \([0-9]\+\)\s*$/\1/')
DE=$(($SZ_FILE / $1))
#echo "$SZ_FILE / $1 == $DE"
PART=0
for ((i=0; i < $1-1; i++))
do
  curl -r "$PART-$(($PART + $DE - 1))" -o "$(basename $2).part$((i+1))" "$2"
  PART=$(($PART + $DE))
done
curl -r "$PART-$(($SZ_FILE - 1))" -o "$(basename $2).part$((i+1))" "$2"
最後由 yjchen 於 週三 4月 16, 2008 11:55 pm 編輯,總共編輯了 3 次。
yjchen
可愛的小學生
可愛的小學生
 
文章: 4
註冊時間: 週六 4月 05, 2008 3:53 am

文章訪客 » 週三 4月 16, 2008 11:25 pm

先用 rename 把 part? 變成 part0? 就可以了,一行搞定。
訪客
 


回到 debian command

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客