컬 대신 aria2를 사용하면 문자열 연결이 끊어집니다.

컬 대신 aria2를 사용하면 문자열 연결이 끊어집니다.

웹사이트를 미러링하려고 하는데 archive.org너무 curl느리기 때문에 한번 시도해 볼까 생각했습니다 aria2.

먼저 이 명령을 사용하여 웹사이트의 링크 그래프를 만듭니다.

wget -c -m --restrict-file-names=nocontrol https://www.example.com/

그런 다음 컬을 사용하여 이 명령을 실행합니다.

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

컬은 마술처럼 선두를 무시합니다../

글쎄, 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

./정확하고 올바른 URL이 제공되는 aria2를 제거하는 방법은 무엇입니까 ?

보너스 질문:

  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

전화를 걸 aria2거나 첫 글자가 포함되지 않은 URL을 사용하려면 다음을 사용하세요.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 {} +

그러면 발견된 여러 경로 이름이 포함된 하위 쉘이 호출됩니다. 서브쉘은 이를 반복하고 ./호출하기 전에 표준 인수 확장을 사용하여 초기 값(이 경우)을 제거합니다 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" {} +

관련된:

관련 정보