BashスクリプトでHTTP経由のリモートファイルの変更時間を取得する


13

HTTP経由でリモートファイルのファイル変更日時を抽出する簡単なBashスクリプトを作成しています。

ファイルの例: 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 2013

もちろんそれは変わったはずです。昔、そういう問題に取り組んだときはそういう感じでした。しかし、時間が経ちます。「アプリ」が何であれ、まだcgiを実行しているサイトを見つけた場合、それらはおそらく処理していませんHEAD。それにもかかわらず、それらはすべてを提供することになっているので、それらのサイトでも結果が得られます。
Karsten S.

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より簡潔です...
Karsten S.

1
@ Hi-Angelいいえ、通常はありません。WgetはIf-Modified-Sinceヘッダーを使用して「このファイルがこの日付より新しい場合にのみファイルを送信する」と言い、そのヘッダーを実装して尊重するかどうかはサーバーに委ねられます。サーバーは、ファイルが変更されていないと判断した場合、304 NOT MODIFIED応答を送信します。
antonagestam 2018

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 2018

ノートの@ not2qubit thx、編集済み。
Hi-Angel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.