使用 aria2 代替curl 会破坏字符串连接

使用 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- 包含在这里以供参考)

这工作正常,find 命令产生了诸如

./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 的最佳设置是什么?

答案1

最后一个不起作用,因为-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')

答案2

添加-printf只会产生输出,不会修改{}被替换的内容。

它似乎curl比现在更聪明(或者,应用更多魔法)aria2,并删除了./.找到的路径名中的首./字母来自于find将生成相对于您开始搜索的顶级目录的路径名。

要使用不包含首字母的 URL调用aria2或,请使用curl./

find . -type f -exec sh -c '
    for pathname do
        pathname=${pathname#./}
        aria2c -x 16 -s 1 "https://web.archive.org/save/https://$pathname"
    done' sh {} +

这将调用一个带有一堆找到的路径名的子 shell。子 shell 将循环遍历这些并./在调用之前使用标准参数扩展删除初始值(在本例中为 )aria2c

一般来说:

topdir=/some/directory/path  # no '/' at the end

find "$topdir" -type f -exec sh -c '
    topdir="$1"; shift
    for pathname do
        pathname=${pathname#$topdir/}
        aria2c -x 16 -s 1 "https://web.archive.org/save/https://$pathname"
    done' sh "$topdir" {} +

有关的:

相关内容