web-dev-qa-db-ja.com

ファイルが新しいかどうかをcurlチェックし、ダウンロードする代わりに-bash(またはpython)スクリプトを実行します

少し問題があります。

リモートサーバーでホストされているファイルがあります( http://mywebsite/file.Zip )。また、いくつかの組み込みLinuxボックス(openelec OSを実行)があります。ボックスのコマンドはかなり制限されていますが、基本的なもの(curl、bashなど)があります。すべてのボックスにファイルが保存されています(/storage/file.Zip)

私がやろうとしているのは、デバイスが完全に起動した後の最初の1分で実行されるスクリプトを設定する必要があり、おそらくcurlを使用してリモートサーバーファイル(mywebsite/file.Zip)がローカルのもの(/storage/file.Zip)よりも新しく、新しい場合はダウンロードする代わりに、bashスクリプト(/storage/scripts/script.sh)を実行する必要があります。

私は通常、このコマンド "curl -o /storage/file.Zip -z /storage/file.Zip http://website/file.Zip "を使用しますが、実行方法がわかりません。ファイルをダウンロードする代わりに、スクリプト。それが可能かどうかさえわかりません。

すべての助けは大歓迎です!

また、念のため、localfileがremotefileよりも古い場合にのみ実行する必要があります。 localfileがremotefileよりも新しい場合(実行されるスクリプトはサーバーからリモートファイルもダウンロードするため、スクリプトを実行する必要はありません。したがって、実行後、localfileは新しいタイムスタンプになります。指定されていない場合は、スクリプトは新しいremotefileでのみ実行されます-無限のループで終了する可能性があります。

4
Stoyan Mihov

ファイル名を確認する代わりに、HTTPサーバーを信頼して、ファイルが最後に変更されたのはいつかを通知し、それに応じて動作することができます。

#!/bin/bash

remote_file="http://mywebsite/file.Zip"
local_file="/storage/file.Zip"

modified=$(curl --silent --head $remote_file | \
             awk '/^Last-Modified/{print $0}' | \
             sed 's/^Last-Modified: //')
remote_ctime=$(date --date="$modified" +%s)
local_ctime=$(stat -c %z "$local_file")
local_ctime=$(date --date="$local_ctime" +%s)

[ $local_ctime -lt $remote_ctime ] && /storage/scripts/script.sh

# end of file.
5
Sami Laine

他の答えは通常のLinuxには最適でしたが、OpenELECでは機能しませんでした。そこで、代わりにサイズで比較することにしました。それは魅力のように機能します。コードは次のとおりです。

#!/bin/bash
Local=$(wc -c < file.Zip)
Remote=$(curl -sI http://server/file.Zip | awk '/Content-Length/ {sub("\r",""); print $2}')
if [ $Local != $Remote ]; then
/bin/bash /storage/scripts/script.sh
else
echo "Same size."
fi
0
Stoyan Mihov