Obtenga el tiempo de modificación del archivo remoto a través de HTTP en la secuencia de comandos Bash

13

Estoy creando una secuencia de comandos Bash simple para extraer la fecha / hora de modificación del archivo de un archivo remoto a través de HTTP.

Archivo de ejemplo: http://example.com/bar/example.pdf

¿Se puede hacer esto sin descargar el archivo real? Si no, ¿cuál es la mejor alternativa?

Amal Murali
fuente

Respuestas:

13

Para ser honesto, no directamente.

Deberá obtener datos del sitio remoto para obtener información sobre el archivo. Por lo general, esto se hace con una HEADsolicitud, pero algunos (¿la mayoría?) Los servidores no lo han implementado correctamente y entregan el archivo completo, al igual que hacer una GETsolicitud. Suponiendo que haya curlinstalado:

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

podría darle lo que desea, pero como se dijo, depende en gran medida del servidor.

Karsten S.
fuente
66
"Más"? Me sorprendería si alguno de los servidores HTTP populares violara el protocolo de esa manera.
user1686
Debería haber cambiado, por supuesto. Hace algún tiempo, cuando lidié con tales problemas, fue así. Sin embargo, el tiempo pasa. Si encuentra sitios que todavía ejecutan cgi cualesquiera que sean las "aplicaciones", lo más probable es que no estén manejando HEAD. Sin embargo, también esos sitios le darán el resultado, ya que se supone que deben entregar todo.
Karsten S.
3
Sugiero usar la --headopción en lugar de -X HEADser más conciso para que el comando se convierta en: curl -s -v --head http://foo.com/bar/baz.pdf 2>&1 | grep '^< Last-Modified:'
Gautham C.
1
curl -svX HEADes aún más conciso ...
Karsten S.
1
@ Hola Ángel No, generalmente no lo hay. Wget usa el encabezado If-Modified-Since para decir "oye, solo envía ese archivo si es más reciente que esta fecha", entonces corresponde al servidor implementar y respetar ese encabezado. Si el servidor cree que el archivo no ha cambiado, envía una respuesta 304 NO MODIFICADA.
antonagestam
12

La respuesta del servidor generalmente tiene un Last-Modifiedcampo, puede verificarlo sin descargar el archivo. No es necesario usar -X HEAD, hay una opción especial -Ipara eso ( -ssuprime la salida de progreso) :

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

También en mi caso no hay ningún curl instalado (estoy haciendo un script para un dispositivo incrustado) , solo wget. La forma con wget es:

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

Los --server-responseencabezados de impresiones, y las --spiderfuerzas opción de no descarga las páginas, sino más bien comprobar su existencia.

Hola angel
fuente
2
Esta curles una mejor respuesta que la aceptada. Quizás el uso grep -idado que a menudo la "última modificación" tiene un caso diferente.
not2qubit
@ not2qubit thx para la nota, editada.
Hola Ángel