Bash

使用 aria2 而不是 curl 會破壞字元串連接

  • July 26, 2018

我正在嘗試將網站鏡像到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?

獎勵問題:

  1. 如果我可以在處理它們的 URL 後(重新)移動頁面,那就太好了。也就是說,將索引從 移動./www.example.com/index./processed/www.example.com/index。我怎麼做?exec命令中有什麼find?還是需要完整的腳本?
  2. 為此目的,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')

引用自:https://unix.stackexchange.com/questions/458296