Schreiben Sie die Ausgabe von wget oder curl in einen benutzerdefinierten Dateinamen, der auf der URL basiert


12

Zum Beispiel habe ich einen Link http://www.abc.com/123/def/ghi/jkl.mno. Ich möchte es mit wgetoder herunterladen curlund bekomme den Namen der Ausgabedatei als def_ghi_jkl.mno, wo das Teil def_ghiaus dem Link genommen wird.

Ich werde diesen wgetBefehl in ein Skript einfügen, um mehrere Dateien herunterzuladen, sodass der Ausgabedateiname nicht explizit angegeben werden kann.

Antworten:


14

curlhat die Option, die ein einzelnes Argument annimmt -o, --outputdas angibt, in welche Dateinamenausgabe anstatt geschrieben werden soll stdout. Wenn Sie Elemente in der URL mit {}oder []umgeben (normalerweise zum Abrufen mehrerer Dokumente), können Sie #im Dateinamen- Bezeichner eine Zahl gefolgt von einer Zahl verwenden. Jede solche Variable wird durch die entsprechende Zeichenfolge für die abgerufene URL ersetzt. Um mehrere Dateien abzurufen, fügen Sie eine durch Kommas getrennte Liste von Token in das Feld ein {}. Wenn Teile der abzurufenden URLs fortlaufende Nummern sind, können Sie einen Bereich mit angeben [].

Beispiele:

  curl http://www.abc.com/123/{def}/{ghi}/{jkl}.mno -o '#1_#2_#3.mno'

Beachten Sie die Anführungszeichen um das Optionsargument (nicht erforderlich, es sei denn, der Dateiname beginnt mit einer der erweiterten Variablen). Dies sollte zur Ausgabedatei führen def_ghi_jkl.mno.

  curl http://www.abc.com/123/{def}/{ghi}/{jkl,pqr,stu}.mno -o '#1_#2_#3.mno'

Dies sollte in den Ausgabedateien führen def_ghi_jkl.mno, def_ghi_pqr.mnound def_ghi_stu.mno.

 curl http://www.abc.com/123/{def}/{ghi}/[1-3].mno -o '#1_#2_#3.mno'

Diese in den Ausgabedateien führen sollen def_ghi_1.mno, def_ghi_2.mno, def_ghi_3.mno.


2

wgethat einen Schalter -O(lange Form --output-document), mit dem Sie den Namen der Datei angeben können, in der gespeichert werden soll. (Vermutlich hat Locken etwas Ähnliches.) Sie könnten also Folgendes tun:

wget -O def_ghi_jkl.mno http://www.abc.com/123/def/ghi/jkl.mno

und es wird tun was du willst.

Sie könnten wahrscheinlich einen Wrapper um wget erstellen, wenn Sie dieses Benennungsschema automatisieren möchten, aber es wäre ziemlich schwierig, kugelsicher zu werden, und es liegt definitiv außerhalb des Bereichs dieser Antwort. (Der einfache Fall einer einzelnen Datei, die von einer expliziten URL heruntergeladen wurde, sollte nicht sehr schwierig zu finden sein, aber das ist nicht die einzige Funktionsweise von wget. Um nur einen Fall zu nennen, der dies nicht ganz einfach macht, können Sie mehrere URLs angeben auf der Kommandozeile.)

Beachten Sie, dass dies -Onicht dasselbe ist wie -o, bei dem die Ausgabe von wget in die angegebene Datei geschrieben wird.


Es ist Teil eines Skripts, das explizit einen solchen Dateinamen angibt.
gvz

@ user47567 Warum nicht? Was ist mit der Tatsache, dass wget oder curl aus einem Skript aufgerufen wird, macht dies unpraktisch? (Und wirklich, wenn Sie solche Einschränkungen haben, welche Antworten funktionieren, sollten diese Informationen wirklich von Anfang an in die Frage
CVn

0

Hier ist ein Bash Substitutionstrick

link="http://www.abc.com/123/def/ghi/jkl.mno"
OutputFile=$( echo ${link:23: 23}| tr "/" "_" )
echo $OutputFile
def_ghi_jkl.mno

{$link:23: 23}entfernen „wird http://www.abc.com/123/ “ ist ${parameter:offset:length}, dann trersetzt /zu _.

So können Sie jetzt ganz einfach mit Wget oder Curl arbeiten

wget $link  -O $OutputFile

Wir können auch awk verwenden, dies extrahiert die letzten drei Felder aus der Eingabezeichenfolge:

OutputFile=$( echo $link | awk -F/ 'BEGIN{OFS="_"}{ print $( NF-2),$(NF - 1 ),$NF}' )

0

Der von Ihnen benötigte Dateiname kann nicht von sich aus abgeleitet werden wget, daher muss er von einem Shell-Skript verarbeitet werden:

$ url='http://www.example.com/123/def/ghi/jkl.mno'
$ outFile=$(echo "$url" | cut -d /  -f 5- | tr / _)
$ echo $outFile 
def_ghi_jkl.mno
$ wget "$url" -O "$outFile"

Oder wenn Sie es als eine Zeile mögen:

wget "$url" -O "$(echo "$url" | cut -d /  -f 5- | tr / _)"

0

Wenn Sie Curl bevorzugen, ist der direkteste Weg:

curl -L -o <filename> "https://drive.google.com/uc?export=download&id=<file id>"

Dateiname: Der Name der heruntergeladenen Datei

Datei-ID: Die ID der Datei in der Webansicht von Google Drive im Format https://drive.google.com/file/d/ Datei-ID / view

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.