Scrivi l'output di wget o arriccia su un nome file personalizzato basato sull'URL


12

Ad esempio ho un link http://www.abc.com/123/def/ghi/jkl.mno. Voglio scaricarlo usando wgeto curle ottenere il nome del file di output come def_ghi_jkl.mno, dove la parte def_ghiè presa dal collegamento.

Metterò questo wgetcomando in uno script per scaricare più file in modo che non possa dare esplicitamente il nome del file di output.

Risposte:


15

curlha l' opzione -o, --outputche accetta un singolo argomento indicante che l'output del nome file deve essere scritto invece di stdout. Se stai utilizzando {}o []per racchiudere elementi nell'URL (in genere utilizzato per recuperare più documenti), puoi utilizzare #seguito da un numero nell'identificatore del nome file. Ciascuna di tali variabili verrà sostituita con la stringa corrispondente per l'URL da recuperare. Per recuperare più file, aggiungi un elenco di token separati da virgola all'interno di {}. Se parti degli URL da recuperare sono numeri sequenziali, è possibile specificare un intervallo con [].

Esempi:

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

Nota le virgolette attorno all'argomento opzione (non necessario a meno che il nome file non inizi con una delle variabili espanse). Ciò dovrebbe comportare il file di output def_ghi_jkl.mno.

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

Questo dovrebbe portare a file di output def_ghi_jkl.mno, def_ghi_pqr.mnoe def_ghi_stu.mno.

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

Questo dovrebbe portare a file di output def_ghi_1.mno, def_ghi_2.mno, def_ghi_3.mno.


2

wgetha un interruttore -O(modulo lungo --output-document) che consente di specificare il nome del file in cui salvare. (Presumibilmente il ricciolo ha qualcosa di simile.) Quindi potresti fare:

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

e farà quello che vuoi.

Probabilmente potresti creare un wrapper attorno a wget se vuoi automatizzare questo schema di denominazione, ma sarebbe piuttosto difficile ottenere un proiettile ed è decisamente fuori dallo scopo di questa risposta. (Il semplice caso di un singolo file scaricato da un URL esplicito non dovrebbe essere molto difficile da ottenere, ma non è l'unica modalità di funzionamento di wget. Per citare solo un caso che lo rende leggermente non banale, puoi specificare più URL dalla riga di comando.)

Si noti che -Onon è affatto lo stesso -o, che scrive l' output proprio di wget nel file indicato.


Fa parte di uno script, il nome file esplicito come quello non funzionerà.
gvz,

@ user47567 Perché no? Che dire del fatto che wget o curl viene chiamato da una sceneggiatura rende ciò poco pratico? (E davvero, se hai tali vincoli su quali risposte funzioneranno, tali informazioni dovrebbero davvero entrare nella domanda dall'inizio.)
un CVn

0

Ecco qualche trucco per sostituire Bash

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}rimuoverà " http://www.abc.com/123/ " è ${parameter:offset:length}, quindi trsostituirà /a _.

Quindi ora puoi facilmente usarlo con wget o curl

wget $link  -O $OutputFile

Inoltre possiamo usare awk, questo estrarrà gli ultimi tre file dalla stringa di input:

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

0

Il nome file che ti serve non può essere derivato da wgetsolo, quindi deve essere gestito da uno script shell:

$ 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"

O se ti piace come una riga:

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

0

Se preferisci l'arricciatura, il modo più diretto è:

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

nome file: il nome del file scaricato

ID file: l'id del file nella vista Web di Google Drive nel formato https://drive.google.com/file/d/ ID file / vista

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.