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?

Amal Murali
fonte

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.

Karsten S.
fonte
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.

Olá anjo
fonte
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