Abrufen der Änderungszeit der Remote-Datei über HTTP im Bash-Skript

13

Ich erstelle ein einfaches Bash-Skript, um die Änderungszeit und das Datum einer Remote-Datei über HTTP zu extrahieren.

Beispieldatei: http://example.com/bar/example.pdf

Kann dies ohne Herunterladen der eigentlichen Datei erfolgen? Wenn nicht, was ist die beste Alternative?

Amal Murali
quelle

Antworten:

13

Um ehrlich zu sein, nicht direkt.

Sie müssen Daten von der Remote-Site abrufen, um Informationen über die Datei zu erhalten. Normalerweise erfolgt dies mit einer HEADAnfrage, aber einige (die meisten?) Server haben es nicht korrekt implementiert und liefern die gesamte Datei, genau wie eine GETAnfrage. Angenommen, Sie haben curlFolgendes installiert:

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

Vielleicht geben Sie, was Sie wollen, aber wie gesagt, es hängt stark vom Server ab.

Karsten S.
quelle
6
"Die meisten"? Es würde mich wundern, wenn einer der beliebten HTTP-Server das Protokoll so verletzen würde.
user1686
Es hätte sich natürlich ändern sollen. Vor einiger Zeit, als ich mich mit solchen Problemen befasste, war es so. Die Zeit vergeht jedoch. Wenn Sie Websites finden, auf denen cgi unabhängig von "Apps" noch ausgeführt wird, werden diese höchstwahrscheinlich nicht verarbeitet HEAD. Trotzdem geben Ihnen auch diese Seiten das Ergebnis, denn sie sollen alles liefern.
Karsten S.
3
Ich schlage vor, die --headOption zu verwenden, anstatt -X HEADsie knapper zu machen, damit der Befehl wie folgt lautet: curl -s -v --head http://foo.com/bar/baz.pdf 2>&1 | grep '^< Last-Modified:'
Gautham C.
1
curl -svX HEADist noch knapper ...
Karsten S.
1
@ Hi-Angel Nein, das gibt es im Allgemeinen nicht. Wget verwendet den If-Modified-Since-Header, um zu sagen: "Hey, senden Sie diese Datei nur, wenn sie neuer als dieses Datum ist". Dann muss der Server diesen Header implementieren und respektieren. Wenn der Server der Meinung ist, dass sich die Datei nicht geändert hat, sendet er eine 304 NOT MODIFIED-Antwort.
Antonagestam
10

Die Serverantwort enthält normalerweise ein Last-ModifiedFeld. Sie können es überprüfen, ohne die Datei herunterladen zu müssen. Keine Notwendigkeit zu verwenden -X HEAD, es gibt eine spezielle Option -Idafür (die -sunterdrückt die Fortschrittsausgabe) :

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

Auch in meinem Fall ist keine Locke installiert (ich mache ein Skript für ein eingebettetes Gerät) , nur wget. Der Weg mit wget ist:

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

Die --server-responseKopfzeilen werden gedruckt, und die --spiderOption erzwingt, keine Seiten herunterzuladen, sondern deren Existenz zu überprüfen.

Hallo Engel
quelle
2
Dies curlist eine bessere Antwort als die akzeptierte. Vielleicht hat die Verwendung grep -ider "zuletzt modifizierten" seit oft einen anderen Fall.
not2qubit
@ not2qubit thx für die Notiz, bearbeitet.
Hi-Angel