Posso interrompere wget creando duplicati?


13

Se eseguo wget due volte, non riconosce che ha già scaricato quel file e ne crea uno nuovo. Esiste un modo per impedirgli di scaricare di nuovo il file?

$ wget https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png.1’
...

(Felice di usare il ricciolo o un'alternativa analizzabile simile se wget non può farlo.)


9
Bene, ne crea uno nuovo perché riconosce che il file è lì!
nico,

Risposte:


17

Ti suggerisco di usare l' -Nopzione.

-N
--timestamping
    Turn on time-stamping.

Abilita il timestamp, che scarica nuovamente il file solo se è più recente sul server rispetto alla versione scaricata.

$ wget -N https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget -N https://cdn.sstatic.net/askubuntu/img/logo.png
...
Server file no newer than local file ‘logo.png’ -- not retrieving.

Caveat (dal commento di KasiyA)

Se il server non è configurato correttamente, potrebbe sempre segnalare che il file è nuovo e -Nscaricare nuovamente il file. In questo caso, -ncè probabilmente un'opzione migliore.


3
Quando un server non è configurato correttamente -Npotrebbe non funzionare e wget verrà sempre scaricato nuovamente. Quindi a volte -ncè meglio di-N
αғsнιη il

1
@Kasiy grazie per il tuo commento, non sembra esserci una buona opzione per tutti i casi.
Jofel

16

Sì è -cun'opzione.

--continue
    Continue getting a partially-downloaded file.  This is useful when you want to
    finish up a download started by a previous instance of Wget, or by another
    program.

Se il file è lo stesso, il secondo tentativo di download verrà interrotto.

$ wget -c https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget -c https://cdn.sstatic.net/askubuntu/img/logo.png
...
The file is already fully retrieved; nothing to do.

Avvertenze (dai commenti di Jofel)

Se il file è stato modificato sul server, l' -copzione può fornire risultati errati.

Con -c, wget chiede semplicemente al server tutti i dati oltre la parte del file già scaricato, nient'altro. Non controlla se ci sono stati cambiamenti nella parte del file che è già stata scaricata. Pertanto, è possibile che un file danneggiato sia un misto tra il vecchio e il nuovo file.


Test locale

È possibile verificare eseguendo semplice web-server locale come segue (grazie a @roadmr 's risposta ):

Apri una finestra di Terminale e digita:

cd /path/to/parent-download-dir/
python -m SimpleHTTPServer

Ora apri un altro Terminale e fai:

wget -c http://localhost:8000/filename-to-download

Si noti che filename-to-downloadè il file che si trova in /path/to/parent-download-dir/cui si desidera scaricare.

Ora se esegui il comando wget per più volte vedrai:

The file is already fully retrieved; nothing to do.

Ok, ora vai alla /path/to/parent-download-dir/directory e aggiungi qualcosa al file sorgente, ad esempio se si tratta di un file di testo, aggiungi una semplice riga aggiuntiva e salva il file. Ora prova con wget -c .... Bene, ora vedrai di nuovo il download del file ma lo hai già scaricato in precedenza.

Motivo: perché riscaricare?

perché le sue dimensioni sono cambiate in dimensioni maggiori rispetto al vecchio file scaricato e nient'altro.


1
Questo non funziona correttamente se il file è stato modificato sul server tra i download. Nel peggiore dei casi (la dimensione del file è aumentata), si ottiene un file danneggiato.
jofel

1
@jofel sì -nc, non come hai detto, ma l' -copzione funzionerà ed è per questo che ho menzionato -cprima l'opzione.
αғsнιη,

Con -c, wgetchiede al server tutti i dati oltre la parte del file già scaricato, nient'altro. Non controlla se nel frattempo ci sono stati cambiamenti nella parte del file già scaricata sul server. Nel peggiore dei casi si ottiene un file danneggiato che è una miscela tra il vecchio e il nuovo file.
Jofel,

dopo aver esaminato le opzioni penso che questo sia utile solo per qualcosa come un file di registro (aggiornamenti incrementali garantiti), in tutti gli altri casi penso che -N o -nc siano più appropriati in quanto gestiscono interi file
david.libremone

3

Inoltre c'è un'altra opzione chiamata -ncper wgetting:

--no-clobber
   If a file is downloaded more than once in the same directory, Wget's behavior
   depends on a few options, including -nc.  In certain cases, the local file will
   be clobbered, or overwritten, upon repeated download.  In other cases it will be
   preserved.

Quando -ncviene specificata l'opzione, Wget rifiuterà di scaricare copie dello stesso file. Se hai lo stesso file che wgettenta di scaricare, si rifiuterà di scaricarlo a meno che tu non rinomini o rimuova il file locale.

$ wget -nc https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget -nc https://cdn.sstatic.net/askubuntu/img/logo.png
File ‘logo.png’ already there; not retrieving.

A volte questa opzione è fortemente valida e ho raccomandato di usare l' -ncopzione al posto di entrambi -co-N opzione perché queste opzioni sovrascriveranno il file di download con il tuo file locale se avessero gli stessi nomi.

Caveat (dal commento di Jofel)

L' -ncopzione non aggiorna il file se è stato modificato sul server. Se sai che il file cambierà, l' -Nopzione è preferibile. Se sai che il file non cambierà (o non ti interessa), allora -ncva bene.


1

So che questa era una domanda specifica riguardante wget ma l'OP ha menzionato "Felice di usare il ricciolo o un'alternativa analizzabile se wget non può farlo". Non sono sicuro di quale sia il requisito qui (più file, mantieni la vecchia versione se diversa dall'originale, sostituisci con la versione appena scaricata). A seconda di cosa vuoi e di come vuoi gestire i duplicati, potresti aver bisogno di più di questo. Un modo molto semplice per fare quello che sembra voler semplicemente usare invece l'arricciatura.

curl http://cdn.sstatic.net/askubuntu/img/logo.png?v=ca4d192163aa > logo.png

Questo comando sostituirà ogni volta il vecchio file con quello appena scaricato.

Non inviarlo al terminale (senza "> [nome file]") se si sta scaricando un file binario anziché testo. Ciò potrebbe potenzialmente rovinare la tua sessione terminale. Nel caso in cui lo facciate per caso, potrebbe essere necessario aprire un'altra sessione di shell / terminale.


Se il tuo terminale è in cattive condizioni perché hai visualizzato i file binari, è forse più facile chiamare il programma "reset" che aprire un nuovo terminale.
jofel

hai ragione sul fatto che non ero chiaro sulle mie esigenze, il felice risultato è che ho imparato alcune altre opzioni :) grazie
david.libremone il

Grazie @jofel ^^ non sapevo di "reset" Ho sempre chiuso una nuova scheda e chiuso quella confusa quando è successo ... anche se non l'ho mai fatto accadere spesso.
Goblinlord,
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.