我們已經分段下載好的檔案,必須按照順序接回來。
但是以下情形不能使用 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"