Usando aria2 ao invés de curl-break concatenação de string

0

Estou tentando espelhar um site para archive.org , mas usar curl é muito lento. Por isso, tentei usar aria2 .

Primeiro, faço um mapa de links do site usando este comando

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

e, em seguida, execute este comando usando o curl

find . -type f -exec curl -v "https://web.archive.org/save/https://{}" ';'

(Na verdade, usei este comando para obter um log suficientemente bom do que estava fazendo

find . -type f -exec curl -v "https://web.archive.org/save/https://{}" ';' 2> >(grep 'Rebuilt URL' >>/tmp/error ) >/tmp/stdout - incluiu aqui para referência)

Isso estava funcionando bem, a saída produzida pelo comando find como

./www.example.com/index

e enrolar magicamente ignoraram o primeiro ./

Bem, Aria2 não foi tão inteligente. Este comando

find . -type f -exec aria2c -x 16 -s 1 "https://web.archive.org/save/https://{}" ';'

leva a esse erro:

07/24 23:40:45 [ERROR] CUID#7 - Download aborted. URI=https://web.archive.org/save/https://./www.example.com/index

(Observe o ./ extra no meio da URL).

Encontrei então esta questão que me ajudou a modificar a saída de encontrar

find . -type f -printf '%P\n'

retorna

www.example.com/index

(sem liderança ./ )

No entanto, ao alimentar isso para aria2, o URL concatenado ainda contém ./ no meio!?!?

find . -type f -printf '%P\n' -exec aria2c -x 16 -s 1 "https://web.archive.org/save/https://{}" ';'

fornece esta mensagem de erro

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

Como faço para me livrar do ./ , então aria2 é alimentada com URLs corretos e adequados?

Perguntas adicionais:

  1. Seria ótimo se eu pudesse (re) mover as páginas depois de processar seu URL. Ou seja, mova o índice de ./www.example.com/index para ./processed/www.example.com/index . Como faço isso? Algo no comando exec do comando find ? Ou isso requer um roteiro completo?

  2. Quais são as configurações ótimas para aria2 para este propósito?

por hensti 25.07.2018 / 10:41

2 respostas

1

O último não funciona porque o -exec é independente de -printf .

Mas você pode usar xargs em vez de -exec :

find . -type f -printf '%P\n' \
    | xargs -I{} aria2c -x 16 -s 1 "https://web.archive.org/save/https://{}"

Você também pode permitir que várias instâncias de aria2c sejam executadas em paralelo com xargs -P <num> .

Uma opção ainda melhor seria criar um descritor de arquivo de find como entrada para aria2 em vez de usar pipes e xargs .

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

Adicionar o -printf apenas produzirá saída, não modificará a que {} é substituído.

Parece que curl é um pouco mais inteligente (ou, como alternativa, aplica mais mágica) do que o que é aria2 e remove ./ . O ./ inicial no nome do caminho encontrado vem do fato de que find produzirá nomes de caminhos relativos ao diretório de nível superior do qual você iniciou a pesquisa.

Para chamar aria2 ou curl com um URL que não contenha o ./ inicial, use

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 {} +

Isso chamará um shell filho com vários nomes de caminhos encontrados. O shell filho fará um loop sobre estes e removerá o ./ inicial usando uma expansão de parâmetro padrão antes de chamar, neste caso aria2c .

Em geral:

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" {} +

Relacionados:

por 25.07.2018 / 11:06