curl pobierz wiele plików ze składnią nawiasu

17

Próbuję pobrać dwa pliki według następującej składni:

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

Problem polega na tym, że tylko pierwszy plik jest zapisywany lokalnie, a drugi został po prostu wydrukowany na standardowe wyjście.

Zdałem sobie sprawę, że jeśli dodam, -Oto działa dobrze:

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

Ale czy to nie jest niepraktyczne, jeśli liczba plików rośnie zbyt duża? Na przykład,

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

Moje pytanie brzmi: czy naprawdę nie ma możliwości pobrania wielu pojedynczych plików jednocześnie curl(bez dodania poprawnej liczby -O)?

Naitree
źródło
1
Dlaczego nie użyć zamiast tego pętli for lub wget?
Rui F Ribeiro
1
@RuiFRibeiro (1) Tak, mogę użyć pętli. Jestem tylko ciekawy, czy curlmogę to osiągnąć. (2) Rozważam nie tylko HTTP (y), protokoły FTP, np. SFTP.
Naitree,
Mam na myśli to, że będąc tak potężnym narzędziem, dlaczego curlpo prostu zawodzi przy tak niezbyt trudnej funkcjonalności?
Naitree,
1
Żeby wyjaśnić, że składnia {}i [](a także *i ?) to globowanie / ekspansja powłoki , curlnigdy ich nie widzi, jest to to samo cocurl url1 url2
vonbrand
wget nie obsługuje SSL
MikeW

Odpowiedzi:

9

Aktualizacja: Zostało to zaimplementowane w curl 7.19.0. Zobacz odpowiedź @Besworks.

Według strony podręcznika nie ma sposobu, aby zachować oryginalną nazwę pliku oprócz używania wielu O. Alternatywnie możesz użyć własnych nazw plików:

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

w wyniku czego http://one.site.comzostały zapisane file_one.txti http://two.site.comzapisane file_two.txt.

lub nawet wiele zmiennych, takich jak

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

skutkując http://site.host1.comzbawieniem site_1, http://host.host1.comzbawieniem host_1i tak dalej.

jschlichtholz
źródło
Lub możesz zrobić coś takiegocurl -$(printf 'O%.0s' {1..3}) http://domain/path/to/{file1,file2,file3}
Max Coplan
0

Istnieje alternatywny sposób pobierania wielu plików za pomocą curl:

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

Uwaga : obowiązkowe miejsce służy do rozgraniczenia różnych adresów URL.

mieszaniec
źródło