Использование 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 . -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 . -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 . Как я могу это сделать? Что-то в исполнении команды 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 .


Еще лучшим вариантом было бы создать дескриптор файла из find качестве входных данных для aria2 вместо использования pipe и xargs .

 aria2c -x 16 -s 1 -i <(find . -type f -printf 'https://web.archive.org/save/https://%P\n') 

Добавление -printf просто выдаст результат, но не изменит то, что {} заменяется.

Кажется, что curl немного умнее (или, наоборот, применяет больше магии), чем aria2 , и удаляет ./ . Начальная ./ в найденном пути основана на том факте, что команда find выдаст пути относительно каталога верхнего уровня, с которого вы начинаете поиск.

Для вызова aria2 или curl с URL, который не содержит начальный ./ , используйте

 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 {} + к 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 зацикливается на них и удаляет начальный ./ используя стандартное расширение параметра перед вызовом, в данном случае 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" {} + к 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" {} + 

Связанные с:

  • Понимание опции -exec `find`