Ao baixar um único arquivo, podemos usar a -O
opção do wget para especificar o nome do arquivo. Quando estou baixando URLs em um arquivo usando wget -i filelist.txt
(filelist.txt contém lista de URLs que quero baixar), como posso construir filelist.txt para que cada arquivo seja renomeado conforme é baixado?
Para Ex, se o filelist.txt contiver o seguinte conteúdo:
--output-document=1.jpg http://images2.example.com/image1.jpg
--output-document=2.jpg http://images2.example.com/image2.jpg
É possível baixar image1.jpg
e salvar como 1.jpg
, image2.jpg
as 2.jpg
?
Editar
Eu sei que posso usar script simples ou técnicas de manipulação de texto para criar vários comandos wget e cada um deles baixa um único URL e grava em um arquivo de saída. Eu não testei, mas isso parece mais lento para mim e quero saber se existe alguma maneira de baixar todos os arquivos usando um único processo wget.
Você não pode fazer isso puramente em uma invocação do Wget. Isso decorre da definição da
-O
opção do Wget, que não significa simplesmente o nome do arquivo salvo, mas sim um redirecionamento de shell de stdout.Se todos os nomes dos arquivos forem diferentes no servidor, você ainda poderá fazer isso rapidamente baixando todos os arquivos em uma única invocação do Wget e usando um script de shell para renomeá-los.
Você está certo em que várias invocações de wget serão lentas. A inicialização e desmontagem do processo é um aspecto, mas a necessidade de fazer uma nova conexão HTTP com o servidor para cada um dos arquivos pode aumentar muito rapidamente
Basta percorrer o arquivo linha por linha, ler o conteúdo da linha na variável
FOO
e usar isso comowget
parâmetro:Este pouco de tempo para construir a linha de comando com parâmetros não o prejudicará, comparado aos tempos de download. Para o lado do servidor, não faz diferença alguma, se os mesmos ou diferentes
wget
processos fizerem as solicitações únicas de arquivos, que são feitas em ambos os cenários, o pequeno Keep-Alive não fará muita diferença, na minha opinião.By the way:
wget
é sempre single threaded, não há parâmetro para torná-lo multithread. Talvez você deva experimentar e ver o quanto é mais lento, iniciando um novowget
processo para cada URL, em vez de usar-i
e esperar que seja mais rápido, para que você não precise adivinhar o quanto é mais lento, mas apenas Veja.Além disso, você pode iniciar vários
wget
processos, semelhantes como pode ser visto em https://stackoverflow.com/questions/7577615/parallel-wget-in-bash/11850469#11850469 (apenas passe mais parâmetros do que lá), o que deve acelerar tudo, para arquivos pequenos.E você ainda pode renomear os arquivos após o download (também esta não é realmente a maneira que você pediu) para atingir seu objetivo, se você precisar construir uma lista de nomes de arquivos de destino de qualquer maneira.