enrolar baixar vários arquivos com sintaxe cinta

17

Estou tentando baixar dois arquivos pela seguinte sintaxe:

curl -O http://domain/path/to/{file1,file2}

O problema é que apenas o primeiro arquivo é realmente salvo localmente e o segundo foi simplesmente impresso no stdout.

Eu percebi que se eu adicionar um, -Oele funciona muito bem:

curl -OO http://domain/path/to/{file1,file2}

Mas isso não é prático se o número de arquivos aumentar muito? Por exemplo,

curl -O http://domain/path/to/file[1,100]

Minha pergunta é: realmente não há como baixar vários arquivos individuais de uma só vez curl(sem adicionar um número correto de -O)?

Naitree
fonte
11
Por que não usar um loop for ou usar wget?
Rui F Ribeiro
11
@RuiFRibeiro (1) Sim, eu posso usar loop. Só estou curioso curlpara conseguir. (2) Estou considerando não apenas HTTP (s), protocolos FTP, por exemplo, SFTP.
Naitree
Quero dizer, sendo uma ferramenta tão poderosa, por que curlapenas falha nessa funcionalidade não tão difícil?
Naitree
11
Apenas para deixar claro que o {}e [](e também *e ?sintaxe) é shell englobamento / expansão, curlnunca chega a vê-los, é o mesmo quecurl url1 url2
vonbrand
O wget não lidar com SSL
MikeW

Respostas:

9

Atualização: Isso foi implementado no curl 7.19.0. Consulte a resposta @Besworks.

De acordo com a página do manual, não há como manter o nome do arquivo original, exceto usando vários O's. Como alternativa, você pode usar seus próprios nomes de arquivo:

curl http://{one,two}.site.com -o "file_#1.txt"

resultando em http://one.site.comserem salvos file_one.txte http://two.site.comsalvos em file_two.txt.

ou até várias variáveis ​​como

curl http://{site,host}.host[1-5].com -o "#1_#2"

resultando em http://site.host1.comserem salvos site_1, http://host.host1.comsalvos host_1e assim por diante.

jschlichtholz
fonte
Ou você pode fazer algo comocurl -$(printf 'O%.0s' {1..3}) http://domain/path/to/{file1,file2,file3}
Max Coplan
0

Existe uma maneira alternativa de baixar vários arquivos com curl:

urls="firstUrl secondUrl thirdUrl" 
for url in $urls
do
   curl -O "$url"
done

Nota : o espaço obrigatório é usado para delimitar URLs diferentes.

daGo
fonte