wget con caratteri jolly nei download http


53

Devo scaricare un file usando wget, tuttavia non so esattamente quale sarà il nome del file.

https://foo/bar.1234.tar.gz

Secondo la pagina man , wget ti consente di spegnere e accendere quando si tratta di un sito ftp, tuttavia ho un URL http.

Come posso usare un jolly mentre utilizzo una wget? Sto usando gnu wget.

Cose che ho provato.

/usr/local/bin/wget -r "https://foo/bar.*.tar.gz" -P /tmp

Aggiornare

L'uso di -A comporta il download di tutti i file che terminano con .tar.gz sul server.

/usr/local/bin/wget -r "https://foo/" -P /tmp -A "bar.*.tar.gz"

Aggiornare

Dalle risposte, questa è la sintassi che alla fine ha funzionato.

/usr/local/bin/wget -r -l1 -np "https://foo" -P /tmp -A "bar*.tar.gz"

2
Questo non è esattamente quello che stai cercando, ma è correlato: Curl ha la capacità di utilizzare i caratteri jolly di base, ad esempio:curl "http://example.com/picture[1-10].jpg" -o "picture#1.jpg"
Hello World,

1
Una Gotcha per me era il -e robots=offparametro da non robots.txt obey: stackoverflow.com/a/11124664/1097104
Juuso Ohtonen

Ho trovato l'aggiunta delle bandiere -nHed è --cut-dirs=<number>stato anche utile
Randall,

Risposte:


62

Penso che questi interruttori faranno quello che vuoi con wget:

   -A acclist --accept acclist
   -R rejlist --reject rejlist
       Specify comma-separated lists of file name suffixes or patterns to 
       accept or reject. Note that if any of the wildcard characters, *, ?,
       [ or ], appear in an element of acclist or rejlist, it will be 
       treated as a pattern, rather than a suffix.

   --accept-regex urlregex
   --reject-regex urlregex
       Specify a regular expression to accept or reject the complete URL.

Esempio

$ wget -r --no-parent -A 'bar.*.tar.gz' http://url/dir/

15

C'è una buona ragione per cui questo non può funzionare direttamente con HTTP, ed è che un URL non è un percorso di file, sebbene l'uso di /come delimitatore possa farlo sembrare come uno, e talvolta corrispondono. 1

Convenzionalmente (o, storicamente), i web server spesso eseguono gerarchie di directory mirror (per alcuni - ad esempio Apache - questo è una specie di integrale) e forniscono persino indici di directory molto simili a un filesystem. Tuttavia, nulla del protocollo HTTP lo richiede.

Questo è significativo, perché se si desidera applicare un glob sul dire, tutto ciò che è un sottotracciato di http://foo/bar/, a meno che il server fornisce un meccanismo per fornire con tale (ad esempio, l'indice di cui sopra), non c'è niente da applicare il glob a . Non esiste un file system lì per la ricerca. Ad esempio, solo perché sai che ci sono pagine http://foo/bar/one.htmle http://foo/bar/two.htmlnon significa che puoi ottenere un elenco di file e sottodirectory tramite http://foo/bar/. Sarebbe completamente entro il protocollo per il server restituire 404 per quello. Oppure potrebbe restituire un elenco di file. Oppure potrebbe inviarti una bella foto jpg. Eccetera.

Quindi non esiste uno standard qui che wgetpuò essere sfruttato. AFAICT, wget lavora per rispecchiare una gerarchia di percorsi esaminando attivamente i collegamenti in ogni pagina . In altre parole, se esegui il mirroring ricorsivo http://foo/bar/index.html, scarica index.htmle quindi estrae i collegamenti che ne sono un sottotraccia. 2 L' -Ainterruttore è semplicemente un filtro che viene applicato in questo processo.

In breve, se sai che questi file sono indicizzati da qualche parte, puoi iniziare con quello usando -A. Altrimenti, sei sfortunato.


1. Naturalmente anche un URL FTP è un URL. Tuttavia, anche se non so molto del protocollo FTP, suppongo in base alla sua natura che potrebbe essere di una forma che consente un globbing trasparente.

2. Ciò significa che potrebbe esserci un URL valido http://foo/bar/alt/whatever/stuff/che non verrà incluso in quanto non è in alcun modo collegato a nulla dell'insieme di cose a cui è collegato http://foo/bar/index.html. A differenza dei filesystem, i web server non sono obbligati a rendere trasparente il layout del loro contenuto, né devono farlo in modo intuitivamente ovvio.


0

La precedente soluzione "-A pattern" potrebbe non funzionare con alcune pagine Web. Questo è il mio modo di aggirare, con una doppia scommessa:

  1. wget la pagina
  2. grep per modello
  3. wget i file)

Esempio: supponiamo che sia una pagina di podcast di notizie e voglio 5 file mp3 dalla parte superiore della pagina:

wget -nv -O- https://example/page/ |
 grep -o '[^"[:space:]]*://[^"[:space:]]*pattern[^"[:space:]]*\.mp3' |
  head -n5 | while read x; do
    sleep $(($RANDOM % 5 + 5))  ## to appear gentle and polite
    wget -nv "$x"
  done

Sta grepcercando link senza spazio tra virgolette che contengono ://e il mio nome file pattern.


che cos'è RANDOM qui?
Royki

Una variabile di shell, vedi la bashpagina man. CASUALE A ogni riferimento a questo parametro, viene generato un numero intero casuale compreso tra 0 e 32767.
turno di notte
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.