Ottieni il tempo di modifica del file remoto su HTTP nello script Bash


13

Sto creando un semplice script Bash per estrarre l'ora / la data di modifica del file di un file remoto tramite HTTP.

File di esempio: http://example.com/bar/example.pdf

Questo può essere fatto senza scaricare il file attuale? In caso contrario, qual è la migliore alternativa?

Risposte:


13

Ad essere onesti, non direttamente.

Dovrai recuperare i dati dal sito remoto per ottenere informazioni sul file. Di solito questo viene fatto con una HEADrichiesta, ma alcuni (la maggior parte?) Server non lo hanno implementato correttamente e consegnano l'intero file, proprio come fare una GETrichiesta. Supponendo che tu abbia curlinstallato:

curl -s -v -X HEAD http://foo.com/bar/baz.pdf 2>&1 | grep '^< Last-Modified:'

potrebbe darti quello che vuoi, ma come detto, dipende molto dal server.


6
"Maggior parte"? Sarei sorpreso se qualcuno dei popolari server HTTP violasse il protocollo in questo modo.
user1686

Dovrebbe essere cambiato ovviamente. Qualche tempo fa, quando ho affrontato tali problemi, è stato così. Tuttavia, il tempo passa. Se trovi siti che eseguono ancora cgi qualunque sia "app", molto probabilmente non li gestiscono HEAD. Tuttavia, anche quei siti ti daranno il risultato, perché dovrebbero fornire tutto.
Karsten S.

3
Io suggerisco di usare l' --headopzione invece di -X HEADcome il suo più laconico così il comando diventerebbe: curl -s -v --head http://foo.com/bar/baz.pdf 2>&1 | grep '^< Last-Modified:'
Gautham C.

1
curl -svX HEADè ancora più conciso ...
Karsten S.

1
@ Ciao-Angelo No, generalmente non c'è. Wget usa l'intestazione If-Modified-Since per dire "hey invia quel file solo se è più recente di questa data", spetta quindi al server implementare e rispettare tale intestazione. Se il server ritiene che il file non sia cambiato, invia una risposta 304 NON MODIFICATA.
antonagestam,

12

La risposta del server di solito ha un Last-Modifiedcampo, è possibile controllarlo senza scaricare il file. Non c'è bisogno di usare -X HEAD, c'è un'opzione speciale -Iper questo ( -ssopprime l'output di avanzamento) :

curl -sI http://example.com/bar/example.pdf | grep -i Last-Modified

Anche nel mio caso non è installato alcun ricciolo (sto facendo uno script per un dispositivo incorporato) , giusto wget. Il modo con wget è:

wget --server-response --spider http://example.com/bar/example.pdf 2>&1 | grep -i Last-Modified

Le --server-responseintestazioni di stampa e l' --spideropzione costringono a non scaricare pagine, ma piuttosto a controllarne l'esistenza.


2
Questa curlè una risposta migliore di quella accettata. Forse usando come grep -ispesso "l'ultima modifica" ha un caso diverso.
not2qubit

@ not2qubit thx per la nota, modificato.
Hi-Angel,
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.