Wie würde ich beim Herunterladen einer Datei mit curl einem Link-Speicherort folgen und diesen für den Ausgabedateinamen verwenden (ohne den Remote-Dateinamen im Voraus zu kennen)?
Wenn Sie beispielsweise auf den folgenden Link klicken, laden Sie einen Dateinamen mit dem Namen "pythoncomplete.vim" herunter. Bei Verwendung der Optionen -O und -L von curl ist der Dateiname jedoch einfach der ursprüngliche Remote-Name, ein ungeschicktes "download_script.php? Src_id = 10872".
curl -O -L http://www.vim.org/scripts/download_script.php?src_id=10872
Um die Datei mit dem richtigen Dateinamen herunterzuladen, müssen Sie den Namen der Datei im Voraus kennen:
curl -o pythoncomplete.vim -L http://www.vim.org/scripts/download_script.php?src_id=10872
Es wäre hervorragend, wenn Sie die Datei herunterladen könnten, ohne den Namen im Voraus zu kennen. Wenn nicht, gibt es eine andere Möglichkeit, eine umgeleitete Datei schnell über die Befehlszeile abzurufen?
quelle
Content-Disposition: attachment; filename = foo.txt
. Die Leerzeichen um die=
Ursache herum (siehe: gist.github.com/jnewman/23c993ef50bcd69f9086fcd4e2594928 )localhost
, müssen Sie es machenhttp://localhost
oder das-J
wird ignoriertWenn Sie eine aktuelle Version von
curl
(7.21.2 oder höher) haben, lesen Sie die Antwort von @ jmanning2k .curl
Wenn Sie eine ältere Version von (wie 7.19.7, die mit Snow Leopard geliefert wurde) haben, führen Sie zwei Anfragen aus: aHEAD
, um den Dateinamen aus dem Antwortheader abzurufen , dann aGET
:quelle
tr -d '\r\n'
zwischen Ihren Befehlen grep und sed hinzugefügt , und es hat wunderbar funktioniert.curl
würde wahrscheinlich auch die-L
Option brauchen .filename=$(curl -sI $url | grep -o -E 'location:.*$' | sed -e 's/location:=//' | xargs basename)
Wenn Sie
wget
anstelle von verwenden könnencurl
:quelle
Ich wollte die Antwort von jmanning2k kommentieren, aber als neuer Benutzer kann ich das nicht. Deshalb habe ich versucht, seinen Beitrag zu bearbeiten, was zulässig ist, aber die Bearbeitung wurde abgelehnt, da es sich um einen Kommentar handeln sollte. Seufzer
Wie auch immer, sehen Sie dies als Kommentar zu seiner Antwort, danke.
Dies scheint nur zu funktionieren, wenn der Header wie
filename=pythoncomplete.vim
im Beispiel aussieht , aber einige Sites senden einen Header, der so aussieht,filename*=UTF-8' 'filename.zip'
dass er von Curl 7.28.0 nicht erkannt wirdquelle
Ich wollte eine Lösung, die sowohl auf älteren als auch auf neueren Macs funktioniert, und der Legacy-Code, den David für Snow Leopard bereitstellte, verhielt sich unter Mavericks nicht gut. Hier ist eine Funktion, die ich basierend auf Davids Code erstellt habe:
Mit dieser Definition können Sie Folgendes ausführen:
quelle
Bitte beachten Sie, dass bestimmte falsch konfigurierte Webserver den Namen mit "Dateiname" als Schlüssel verwenden, wobei RFC2183 angibt, dass er "Dateiname" sein soll. Curl behandelt nur den letzteren Fall.
quelle
Ein Beispiel mit der obigen Antwort für das Apache Archiva-Artefakt-Repository zum Abrufen der neuesten Version. Die Locke gibt die Position Zeile zurück und der Dateiname befindet sich am Ende der Zeile. Die CR muss am Ende des Dateinamens entfernt werden.
quelle
Ich hatte das gleiche Problem wie John Cooper. Ich habe keinen Dateinamen, sondern einen Standortdateinamen zurückbekommen. Seine Antwort hat auch funktioniert, aber es gibt 2 Befehle. Dieser Oneliner hat bei mir funktioniert ....
url="https://download.mozilla.org/?product=firefox-latest-ssl&os=linux64&lang=de";url=$(curl -L --head -w '%{url_effective}' $url 2>/dev/null | tail -n1) ; curl -O $url
Gestohlen und einige Sachen von /unix/126252/resolve-filename-from-a-remote-url-without-downloading-a-file hinzugefügt
quelle