批次下載無名備份相簿 Script

最近無名要關了,我家寶貝之前也在那裡擺了一些東西,只好趕緊打包下載回來,不過無名還真是沒有誠意,相簿的內容居然只給下載的檔案列表,例如:

xxx-data \
-- album \
---- 1.txt
---- 2.txt
---- 3.txt

檔案列表裡全部都是相片的網址,例如

http://f12.wretch.yimg.com/xxx/1/1234567890.jpg?nsf4.gf6y6RHJJatuXZpN3YJNVARsYRt.bw0RMZubyvcsQMPtA4Tpw--

雖然官方有提供方法讓人大量下載,但都需要額外安裝軟體,還是不夠方便,所以一時心血來潮,寫了個 shell script 讓大家可以方便的把相簿的內容下載回來。

Script

這個程式只能應用在 unix-like 系統,如果是 windows 的使用者,還是用官方提供的方案比較簡單一些。

進入備份資料中的 album 資料夾,然後執行

find . -name "*.txt" -exec awk -F"[/\?]" '{ if($5!=""){cmd="mkdir -p " $5; system(cmd); cmd="curl -o " $5 "/" $6 " " $0; system(cmd)} }' {} +

程式會在 album 目錄下,依據相簿的編號,建立新的資料夾,並把下載下來的照片放到該資料夾中。

奇怪的 Awk Bug

環境: Mac OS 10.8.2

譬如下載列表檔案 1.txt 的內容如下

$ cat 1.txt
http://f12.wretch.yimg.com/xxx/1/1234567890.jpg?nsf4.gf6y6RHJJatuXZpN3YJNVARsYRt.bw0RMZubyvcsQMPtA4Tpw--

執行下列指令

awk -F"[/\?]" '{print "a = " $0 " b = " $1}' 1.txt

應該要 print 出

a = http://f12.wretch.yimg.com/xxx/1/1234567890.jpg?nsf4.gf6y6RHJJatuXZpN3YJNVARsYRt.bw0RMZubyvcsQMPtA4Tpw-- b = http:

但實際上卻是

b = http:f12.wretch.yimg.com/xxx/1/1234567890.jpg?nsf4.gf6y6RHJJatuXZpN3YJNVARsYRt.bw0RMZubyvcsQMPtA4Tpw--

感覺像是 $0 不會讓字串指標向前移動,所以後來的字串全部從位置 0 的地方開始輸出,把正確的內容給覆蓋掉了。即使我把 $0 設給另一個變數,或是改用 sprintf 都有一樣的結果。然而如果把 $0 放到字串的最末端,則不會產生問題,姑且把它當作一個 feature 來看,幸好只要改變參數的位置就可以繞過這個問題。

本來以為是 Mac OS X 內建的 awk 太舊了

$ /usr/bin/awk --version
awk version 20070501

不過從 Homebrew 安裝了新版的 (awk version 20121220) 之後,或是改用 gawk,問題依舊存在,或許是更底層的 lib 有問題吧!暫時也懶得去追究了。