Bash
使用 aria2 而不是 curl 會破壞字元串連接
我正在嘗試將網站鏡像到
archive.org
但使用curl
速度很慢,所以我想嘗試一下aria2
。我首先使用此命令製作站點的連結圖
wget -c -m --restrict-file-names=nocontrol https://www.example.com/
然後使用 curl 執行此命令
find . -type f -exec curl -v "https://web.archive.org/save/https://{}" ';'
(實際上我使用這個命令來獲得足夠好的日誌記錄我在做什麼
find . -type f -exec curl -v "https://web.archive.org/save/https://{}" ';' 2> >(grep 'Rebuilt URL' >>/tmp/error ) >/tmp/stdout
- 將其包含在此處以供參考)這工作正常,查找命令產生的輸出如
./www.example.com/index
curl 神奇地忽略了領先
./
嗯,Aria2 沒那麼聰明。這個命令
find . -type f -exec aria2c -x 16 -s 1 "https://web.archive.org/save/https://{}" ';'
導致此錯誤:
07/24 23:40:45 [ERROR] CUID#7 - Download aborted. URI=https://web.archive.org/save/https://./www.example.com/index
./
(請注意URL 中間的額外內容)。然後我發現這個問題幫助我修改了 find 的輸出
find . -type f -printf '%P\n'
返回
www.example.com/index
(無前導
./
)但是,當將其提供給 aria2 時,連接的 URL仍然包含
./
在中間!?!?find . -type f -printf '%P\n' -exec aria2c -x 16 -s 1 "https://web.archive.org/save/https://{}" ';'
給出這個錯誤資訊
www.example.com/index 07/24 23:52:34 [NOTICE] Downloading 1 item(s) [#d44753 0B/0B CN:1 DL:0B] 07/24 23:52:35 [ERROR] CUID#7 - Download aborted. URI=https://web.archive.org/save/https://./www.example.com/index Exception: [AbstractCommand.cc:351] errorCode=29 URI=https://web.archive.org/save/https://./www.example.com/index -> [HttpSkipResponseCommand.cc:232] errorCode=29 The response status is not successful. status=502 07/24 23:52:35 [NOTICE] Download GID#d44753fe24ebf448 not complete: Download Results: gid |stat|avg speed |path/URI ======+====+===========+======================================================= d44753|ERR | 0B/s|https://web.archive.org/save/https://./www.example.com/index
我如何擺脫
./
這樣的 aria2 提供正確和正確的 URL?獎勵問題:
- 如果我可以在處理它們的 URL 後(重新)移動頁面,那就太好了。也就是說,將索引從 移動
./www.example.com/index
到./processed/www.example.com/index
。我怎麼做?exec
命令中有什麼find
?還是需要完整的腳本?- 為此目的,aria2 的最佳設置是什麼?
最後一個不起作用,因為
-exec
獨立於-printf
.但是您可以使用
xargs
而不是-exec
:find . -type f -printf '%P\n' \ | xargs -I{} aria2c -x 16 -s 1 "https://web.archive.org/save/https://{}"
您還可以讓多個
aria2c
實例與xargs -P <num>
.一個更好的選擇是創建一個文件描述符
find
作為輸入,aria2
而不是使用管道和xargs
.aria2c -x 16 -s 1 -i <(find . -type f -printf 'https://web.archive.org/save/https://%P\n')