![使用 aria2 代替curl 会破坏字符串连接](https://linux22.com/image/137463/%E4%BD%BF%E7%94%A8%20aria2%20%E4%BB%A3%E6%9B%BFcurl%20%E4%BC%9A%E7%A0%B4%E5%9D%8F%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%BF%9E%E6%8E%A5.png)
我正在尝试镜像一个网站,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 的情况?
奖励问题:
如果我可以在处理 URL 后(重新)移动这些页面,那就太好了。即,将索引从 移动
./www.example.com/index
到./processed/www.example.com/index
。我怎么做?exec
命令中的某些内容find
?或者这需要一个完整的脚本吗?为此目的 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" {} +
有关的: