Come posso fare in modo che wget rinominare i file scaricati per non includere la stringa di query?


32

Sto scaricando un sito con wget e molti link hanno delle domande a loro collegate, quindi quando faccio questo:

wget -nv -c -r -H -A mp3 -nd http://url.to.old.podcasts.com/

Finisco con molti file come questo:

1.mp3?foo=bar
2.mp3?blatz=pow
3.mp3?fizz=buzz

Quello che vorrei finire è:

1.mp3
2.mp3
3.mp3

Tutto questo sta avvenendo in Ubuntu Linux e ho wget 1.10.2.

So di poterlo fare dopo aver ottenuto tutto tramite uno script per rinominare tutto. Tuttavia, mi piacerebbe davvero una soluzione dall'interno di wget, così posso vedere i nomi corretti mentre il download sta avvenendo.

Qualcuno può aiutarmi a svelare questo?


Pubblica la tua domanda su www.stackoverflow.com.
Deniz Zoeteman,

3
@TutorialPoint perché? la domanda è alla ricerca di un modo per farlo, così SO dovrebbe migrarlo di nuovo qui.
Quack Quixote,

Bene, non esiste un modo per farlo
ayrnieu,

1
@ayrnieu: non in un solo comando, no. e non senza un aiuto. ma puoi certamente farlo con un minimo di n + 1 wgetcomandi (se non meno).
Quack Quixote,

Risposte:


24

Se il server è gentile, sul download potrebbe essere presente un'intestazione Content-Disposition che avvisa il client del nome file corretto. Dire a wget di ascoltare quell'intestazione per il nome file finale è semplice come:

wget --content-disposition

Avrai bisogno di una versione nuova di wget per utilizzare questa funzione.

Non ho idea di come gestisca un server che rivendica un nome file di '/ etc / passwd'.


Non ho problemi con questa risposta, poiché senza dubbio funziona per alcune situazioni. Sfortunatamente, non ha funzionato per me rispetto ad alcune pagine servite da cloudfront con il ?v=blahtipo versioning in esse. Potrebbe esserci un modo specifico per il cloudfront di richiedere un documento senza questi, non lo so, ma non sono riuscito a trovarne uno, quindi in questo caso potrebbe essere necessario qualcosa come una delle altre risposte. (Se qualcuno conosce un modo per spogliare - o impedire a Cloudfront di non servire - le v=stringhe, mi piacerebbe sentirne parlare.)
lindes

17

Mi sono reso conto dopo aver elaborato un batch di grandi dimensioni che avrei dovuto incaricare wgetdi ignorare le stringhe di query. Non volevo farlo di nuovo, quindi ho realizzato questo script che ha funzionato per me:

# /bin/bash
for i in `find $1 -type f`
do
    mv $i `echo $i | cut -d? -f1`
done

Mettilo in un file simile rmqstre chmod +x rmqstr sintassi:./rmqstr <directory (defaults to .)>

Rimuoverà ricorsivamente le stringhe di query da tutti i nomi di file.


2
Vorrei aggiungere `-name" \? "` Per trovare una parte da limitare solo ai file necessari :)
Arkadiusz 'vola' Rzadkowolski il

4

Penso che, per wgetpoter salvare come nome file diverso da quello specificato dall'URL, devi usare l' -O filenameargomento. Questo fa solo quello che vuoi quando gli dai un singolo URL - con più URL, tutto il contenuto scaricato finisce in filename.

Ma questa è davvero la risposta. Invece di provare a fare tutto in un solo wgetcomando, usa più comandi. Ora il tuo flusso di lavoro diventa:

  1. Esegui wgetper ottenere i file HTML di base contenenti i tuoi collegamenti;
  2. Analizza per URL;
  3. Cerca ogni URL che termina con mp3,
    1. URL di processo per ottenere un nome file (ad es. trasformarlo http://foo/bar/baz.mp3?gargle=blasterinbaz.mp3
    2. (facoltativo) verifica che il nome file non esista
    3. correre wget <URL> -O <filename>

Questo risolve il tuo problema, ma ora devi capire come afferrare i file di base per trovare i tuoi mp3URL.

Hai in mente un particolare sito / URL di base? I passaggi 1 e 3 saranno più facili da gestire con un esempio concreto.


1

così posso vedere i nomi corretti mentre il download sta avvenendo.

OK. Usa wget come fai normalmente; usa lo script post-wget che usi normalmente, ma elabora l'output di wget in modo che sia più facile per gli occhi:

#! /bin/sh
exec wget --progress=bar:force $* 2>&1 | \
  perl -pe 'BEGIN { $| = 1 } s,(?<=`)([^\x27?]+),\e[36;1m$1\e[0m, if /^Saving/'
cgi-cut # rename files

Questo mostrerà comunque ?foo=barcome si scarica, ma mostrerà il resto del nome in ciano brillante.


Ciò risolve in qualche modo il problema dei nomi dei file visualizzati, ma l'OP vuole anche che il nome del file finale non abbia la stringa di query.
Michael Mior,

1

Ho un approccio simile a @Gregory Wolf perché il suo codice ha sempre creato messaggi di errore come questo:

mv: './file' e './file' sono lo stesso file

Quindi controllo prima se c'è una stringa di query nel nome del file prima di spostare il file:

for f in $(find $1 -type f); do
    if [ $f = ${f%%\?*} ]; then continue; fi
    mv "${f}" "${f%%\?*}"
done

Questo controllerà ricorsivamente ogni file e rimuoverà tutte le stringhe di query nei loro nomi di file, se disponibili.


0

Guarda questi due comandi che ho creato per clonare un sito e, dopo aver fatto il clone, puoi eseguire il secondo comando.

Il secondo comando analizzerà l'intero clone, cercherà i nomi dei modelli di file " ? " E rimuoverà la stringa di query dal nome del file.

# Clone entire site.
    wget --content-disposition --execute robots=off --recursive --no-parent --continue --no-clobber http://example.com

# Remove query string from a static resource.
for i in `find $1 -type f -name "*\?*"`; do mv $i `echo $i | cut -d? -f1`; done

(Vedi in GitHub Gist .)


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.