Получить время модификации удаленного файла по HTTP в скрипте Bash

13

Я создаю простой скрипт Bash для извлечения времени / даты модификации файла из удаленного файла через HTTP.

Пример файла: http://example.com/bar/example.pdf

Можно ли это сделать без загрузки самого файла? Если нет, то какая лучшая альтернатива?

Амаль Мурали
источник

Ответы:

13

Если честно, не напрямую.

Вам нужно будет получить данные с удаленного сайта, чтобы получить информацию о файле. Обычно это делается с помощью HEADзапроса, но некоторые (большинство?) Серверы не реализовали его правильно и доставляют файл целиком, как при выполнении GETзапроса. Предполагая, что вы curlустановили:

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

может дать вам то, что вы хотите, но, как уже говорилось, это сильно зависит от сервера.

Карстен С.
источник
6
"Наиболее"? Я был бы удивлен, если какой-либо из популярных серверов HTTP нарушил протокол таким способом.
user1686
Это должно было измениться конечно. Некоторое время назад, когда я имел дело с такими проблемами, это было так. Однако время проходит. Если вы найдете сайты, на которых все еще работает cgi, независимо от «приложений», они, скорее всего, не обрабатывают HEAD. Тем не менее, и эти сайты дадут вам результат, потому что они должны все доставлять.
Карстен С.
3
Я предлагаю использовать --headвариант вместо -X HEADкак его более лаконична , поэтому команда стала бы: curl -s -v --head http://foo.com/bar/baz.pdf 2>&1 | grep '^< Last-Modified:'
Gautham С
1
curl -svX HEADеще более кратко ...
Карстен С.
1
@ Привет, Ангел. Нет, обычно нет. Wget использует заголовок If-Modified-Since, чтобы сказать «эй, отправьте этот файл, только если он новее, чем эта дата», тогда это зависит от сервера, чтобы реализовать и уважать этот заголовок. Если сервер считает, что файл не изменился, он отправляет ответ 304 NOT MODIFIED.
антагонестам
12

Ответ сервера обычно имеет Last-Modifiedполе, вы можете проверить его, не загружая файл. Нет необходимости в использовании -X HEAD, нет специальной опции -Iдля этого (на -sПодавляет вывод о ходе работы ) :

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

Также в моем случае нет установленного curl (я делаю скрипт для встроенного устройства) , просто wget. Способ с помощью wget:

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

В --server-responseпечатает заголовки, и --spiderопция заставляет не загружать страницы, а проверить их существование.

Привет, ангел
источник
2
Это curlлучший ответ, чем принятый. Возможно, с grep -iтех пор, как часто «последний измененный» имеет другой случай.
not2qubit
@ not2qubit thx для заметки, отредактировано.
Привет, Ангел,