웹사이트를 미러링하려고 하는데 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를 제거하는 방법은 무엇입니까 ?
보너스 질문:
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
전화를 걸 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" {} +
관련된: