Obter tempo de modificação do arquivo remoto por HTTP no script Bash


13

Estou criando um script Bash simples para extrair a data / hora da modificação do arquivo de um arquivo remoto via HTTP.

Arquivo de exemplo: http://example.com/bar/example.pdf

Isso pode ser feito sem o download do arquivo real? Se não, qual é a melhor alternativa?

Respostas:


13

Para ser honesto, não diretamente.

Você precisará buscar dados do site remoto para obter informações sobre o arquivo. Normalmente, isso é feito com uma HEADsolicitação, mas alguns servidores (a maioria?) Não a implementaram corretamente e entregam o arquivo inteiro, assim como fazem uma GETsolicitação. Supondo que você curlinstalou:

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

pode dar o que você deseja, mas, como foi dito, depende muito do servidor.


6
"A maioria"? Eu ficaria surpreso se algum dos servidores HTTP populares violasse o protocolo dessa maneira.
user1686

Deveria ter mudado, é claro. Algum tempo atrás, quando eu lidei com esses problemas, era assim. No entanto, o tempo passa. Se você encontrar sites que ainda executam o cgi, independentemente de "aplicativos", é provável que eles não estejam lidando com isso HEAD. No entanto, também esses sites fornecerão o resultado, porque eles devem fornecer tudo.
21813 Karsten S.

3
Sugiro usar a --headopção em vez de -X HEADser mais concisa, para que o comando se torne: # curl -s -v --head http://foo.com/bar/baz.pdf 2>&1 | grep '^< Last-Modified:'
Gautham C.

11
curl -svX HEADé ainda mais conciso ...
Karsten S.

11
@ Hi-Angel Não, geralmente não existe. O Wget usa o cabeçalho If-Modified-Since para dizer "ei, apenas envie esse arquivo se for mais recente que esta data", então cabe ao servidor implementar e respeitar esse cabeçalho. Se o servidor achar que o arquivo não foi alterado, ele enviará uma resposta 304 NÃO MODIFICADA.
antonagestam 18/07/2018

12

A resposta do servidor geralmente possui um Last-Modifiedcampo, você pode verificá-lo sem fazer o download do arquivo. Não há necessidade de usar -X HEAD, há uma opção especial -Ipara isso ( -ssuprime a saída do progresso) :

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

Também no meu caso não há curl instalado (estou fazendo um script para um dispositivo incorporado) , apenas wget. O caminho com o wget é:

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

Os --server-responsecabeçalhos de impressão e a --spideropção obrigam a não fazer o download de páginas, mas a verificar sua existência.


2
Esta curlé uma resposta melhor que a aceita. Talvez o uso, grep -ijá que muitas vezes o "modificado pela última vez", tenha um caso diferente.
Not2qubit 14/09/19

@ not2qubit thx para a nota, editada.
Hi-Angel
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.