Uzyskaj czas modyfikacji zdalnego pliku przez HTTP w skrypcie Bash

13

Tworzę prosty skrypt Bash, aby wyodrębnić godzinę / datę modyfikacji pliku zdalnego pliku przez HTTP.

Przykładowy plik: http://example.com/bar/example.pdf

Czy można to zrobić bez pobierania rzeczywistego pliku? Jeśli nie, jaka jest najlepsza alternatywa?

Amal Murali
źródło

Odpowiedzi:

13

Szczerze mówiąc, nie bezpośrednio.

Będziesz musiał pobrać dane ze zdalnej strony, aby uzyskać informacje o pliku. Zwykle odbywa się to za pomocą HEADżądania, ale niektóre (większość?) Serwery nie zaimplementowały go poprawnie i nie dostarczyły całego pliku, podobnie jak wykonanie GETżądania. Zakładając, że curlzainstalowałeś:

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

może dać ci to, czego chcesz, ale jak już powiedziano, w dużym stopniu zależy to od serwera.

Karsten S.
źródło
6
"Większość"? Byłbym zaskoczony, gdyby któryś z popularnych serwerów HTTP naruszył protokół w taki sposób.
user1686
Oczywiście powinno to się zmienić. Jakiś czas temu, kiedy miałem do czynienia z takimi problemami, tak było. Jednak czas mija. Jeśli znajdziesz witryny, na których nadal działają cgi, niezależnie od „aplikacji”, najprawdopodobniej nie są obsługiwane HEAD. Niemniej jednak te strony dadzą ci wynik, ponieważ mają dostarczyć wszystko.
Karsten S.,
3
Proponuję za pomocą --headopcji zamiast -X HEADjak jego bardziej lakoniczny więc polecenie będzie stać: curl -s -v --head http://foo.com/bar/baz.pdf 2>&1 | grep '^< Last-Modified:'
Gautham C.
1
curl -svX HEADjest jeszcze bardziej zwięzły ...
Karsten S.
1
@ Hi-Angel Nie, generalnie nie ma. Wget używa nagłówka If-Modified-Since, aby powiedzieć „hej, wyślij ten plik tylko wtedy, gdy jest on nowszy niż ta data”, wtedy to serwer musi wdrożyć i przestrzegać tego nagłówka. Jeśli serwer uważa, że ​​plik się nie zmienił, wysyła odpowiedź 304 NIE ZMODYFIKOWANY.
antonagestam
12

Odpowiedź serwera zazwyczaj zawiera Last-Modifiedpole, które można sprawdzić bez pobierania pliku. Nie ma potrzeby używania -X HEAD, jest to specjalna opcja -Ido tego (to -sPomija postęp wyjście) :

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

Również w moim przypadku nie ma zainstalowanego curl (robię skrypt dla urządzenia osadzonego) , po prostu wget. Sposób z wget to:

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

W --server-responsedrukuje nagłówki, oraz --spideropcja wymusza, aby nie pobierać strony, ale raczej sprawdzić ich istnienie.

Cześć aniele
źródło
2
To curllepsza odpowiedź niż zaakceptowana. Być może używanie grep -i„ostatniej modyfikacji” ma często inny przypadek.
not2qubit
@ not2qubit thx dla notatki, zredagowanej.
Hi-Angel