Отримайте час модифікації віддаленого файлу через 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 таким чином порушив протокол.
користувач1686

Це мало змінити звичайно. Деякий час тому, коли я мав справу з такими проблемами, було так. Однак час проходить. Якщо ви знайдете сайти, на яких все ще працює cgi незалежно від "додатків", вони швидше за все не обробляють HEAD. Тим не менш, і ці сайти дадуть вам результат, оскільки вони повинні доставити все.
Карстен С.

3
Я пропоную використовувати --headваріант, а не -X HEADйого більш короткий, щоб команда стала: curl -s -v --head http://foo.com/bar/baz.pdf 2>&1 | grep '^< Last-Modified:'
Gautham C.

1
curl -svX HEADще більш короткий ...
Карстен С.

1
@ Привіт-Ангел Ні, там взагалі немає. Wget використовує заголовок If-Modified-Since, щоб сказати, "hey надсилає цей файл лише в тому випадку, якщо він є новішим, ніж ця дата", тоді сервер повинен реалізувати та поважати цей заголовок. Якщо сервер вважає, що файл не змінився, він надсилає відповідь 304 NOT MODIFIED.
antonagestam

12

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

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

Також у моєму випадку не встановлено завиток (я роблю сценарій для вбудованого пристрою) , просто 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 для замітки відредаговано.
Привіт-Ангел
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.