Locken Sie mehrere Dateien mit geschweiften Klammern herunter

17

Ich versuche, zwei Dateien mit der folgenden Syntax herunterzuladen:

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

Das Problem ist, dass nur die erste Datei lokal gespeichert wird und die zweite einfach auf stdout gedruckt wurde.

Ich habe festgestellt, dass -Oes gut funktioniert , wenn ich ein hinzufüge :

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

Aber ist das nicht unpraktisch, wenn die Anzahl der Dateien zu groß wird? Beispielsweise,

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

Meine Frage ist, gibt es wirklich keine Möglichkeit, mehrere einzelne Dateien gleichzeitig mit herunterzuladen curl(ohne eine korrekte Anzahl von -O)?

Naitree
quelle
1
Warum nicht stattdessen eine for-Schleife oder wget verwenden?
Rui F Ribeiro
1
@RuiFRibeiro (1) Ja, ich kann loop benutzen. Ich bin nur gespannt, ob ich curles schaffen kann. (2) Ich berücksichtige nicht nur HTTP (s), FTP-Protokolle, z. B. SFTP.
Naitree,
Ich meine, ein so mächtiges Werkzeug zu sein, warum curlscheitert es einfach an dieser nicht so harten Funktionalität?
Naitree,
1
Nur um zu verdeutlichen, dass die Syntax {}und [](und auch *und ?) Shell- Globbing / curlcurl url1 url2
-Erweiterung
wget behandelt SSL nicht
MikeW

Antworten:

9

Update: Dies wurde in curl 7.19.0 implementiert. Siehe @Besworks Antwort.

Laut der Manpage gibt es keine Möglichkeit, den ursprünglichen Dateinamen beizubehalten, außer wenn mehrere O's verwendet werden. Alternativ können Sie auch eigene Dateinamen verwenden:

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

was dazu führt, http://one.site.comdass gespeichert file_one.txtund http://two.site.comgespeichert wird file_two.txt.

oder auch mehrere Variablen mögen

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

was dazu führt, http://site.host1.comdass gespeichert wird in site_1, http://host.host1.comgespeichert wird in host_1und so weiter.

jschlichtholz
quelle
Oder Sie könnten etwas tun wiecurl -$(printf 'O%.0s' {1..3}) http://domain/path/to/{file1,file2,file3}
Max Coplan
23

Mir ist klar, dass es bereits eine akzeptierte Antwort auf diese Frage gibt, aber ich sollte darauf hinweisen, dass es tatsächlich einen Weg gibt, dies zu tun.

Die --remote-name-allOption weist curl an, sich so zu verhalten, als ob Sie -Ooder --remote-namefür jede Datei verwendet hätten.

https://curl.haxx.se/docs/manpage.html#--remote-name-all

Diese Option ist seit Version 7.19.0 verfügbar

https://curl.haxx.se/changes.html#7_19_0

Besworks
quelle
0

Es gibt eine alternative Möglichkeit, mehrere Dateien mit curl herunterzuladen:

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

Hinweis : Das obligatorische Leerzeichen dient zum Abgrenzen verschiedener URLs.

Kanake
quelle