curl prüft, ob die Datei neuer ist und statt des Herunterladens ein Bash-Skript (oder Python-Skript) ausführt

4538
Stoyan Mihov

Ich habe ein Problem.

Ich habe eine Datei, die sich auf einem Remote-Server befindet ( http: //mywebsite/file.zip ). Ich habe auch ein paar eingebettete Linux-Boxen (Openelec OS). Die Boxen haben ziemlich begrenzte Befehle, aber sie haben immer noch die Grundfunktionen - curl, bash usw. In allen ist die Datei gespeichert (/storage/file.zip).

Was ich versuche zu tun ist - ich muss ein Skript einrichten, das in der ersten Minute ausgeführt wird, nachdem das Gerät vollständig gestartet ist, und es wird wahrscheinlich curl verwenden, um zu prüfen, ob die Remote-Server-Datei (mywebsite / file.zip) ist neuer als das lokale (/storage/file.zip), und statt es herunterzuladen, wenn es neuer ist, muss ein Bash-Skript ausgeführt werden (/storage/scripts/script.sh)

Normalerweise verwende ich diesen Befehl "curl -o /storage/file.zip -z /storage/file.zip http: //website/file.zip ", aber ich habe keine Ahnung, wie ich das Skript ausführen soll, anstatt das Skript herunterzuladen Datei. Nicht einmal sicher, ob es überhaupt möglich ist.

Alle Hilfe wird sehr geschätzt!

Nur um sicherzugehen, dass es nur ausgeführt werden muss, wenn localfile älter ist als remotefile. Wenn localfile neuer als remotefile ist, muss das Skript nicht ausgeführt werden, da das Skript, das ausgeführt wird, auch die entfernte Datei vom Server herunterlädt. Nach der Ausführung wird localfile mit einem neueren Zeitstempel versehen, der, wenn nicht anders angegeben, verwendet wird Das Skript wird nur bei einer neueren Remotedatei ausgeführt - es könnte in einer Endlosschleife enden.

4
Gibt es eine Versionsnummer in der Datei oder im Dateinamen? (mag hässlich sein, aber es war das erste, was ich dachte, kombiniert mit dem Speichern und der alten Kopie / Version und dem Vergleichen dieser). Hennes vor 8 Jahren 0
Gibt es leider nicht. Das Hinzufügen einer Nummer oder einer Version zur Datei würde auch das Umschreiben von etwa 200 anderen Skripts bedeuten, was im Moment leider nicht möglich ist. Ich glaube, -z prüfe das Änderungsdatum, und es hat gut funktioniert, um die Dateien zu aktualisieren. Ich möchte jedoch nur den Unterschied zwischen den Dateien als Referenz dafür verwenden, ob das Bash-Skript ausgeführt werden soll oder nicht. Stoyan Mihov vor 8 Jahren 0

2 Antworten auf die Frage

4
Sami Laine

Anstatt nach dem Dateinamen zu suchen, können Sie sich darauf verlassen, dass Ihr HTTP-Server Ihnen mitteilt, wann die Datei zuletzt geändert wurde, und entsprechend handeln.

#!/bin/bash  remote_file="http://mywebsite/file.zip" local_file="/storage/file.zip"  modified=$(curl --silent --head $remote_file | \ awk '/^Last-Modified/' | \ 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. 
Hey, das klingt großartig - immer wenn ich es ausführe, bekomme ich einen Fehler - stat: invalid option - 'c' Anscheinend ist stat auf openElec sehr begrenzt. Gibt es eine andere Option, die ich verwenden kann? Vielen Dank! Stoyan Mihov vor 8 Jahren 0
Ich habe eine kleine Änderung vorgenommen und das erste local_ctime = $ (stat -c% z "$ local_file") in local_ctime = $ (curl --silent --head file: // $ local_file | awk -F: '/ ^ Last geändert -Modified / ') Aber jetzt bekomme ich dies, wenn ich das Skript ausführte: Datum: ungültiges Datum' So, 06. März 2016 14 'Datum: ungültiges Datum' Fr, 04. März 2016 23 '. Sie führt script.sh auch dann aus, wenn die lokale Datei NEUER als die entfernte Datei ist. Ein Teil des Skripts besteht darin, die Datei schließlich herunterzuladen. Dadurch wird der andere Zeitstempel hinzugefügt, der neuer ist als der Server, und es endet in einer Schleife, da localfile fast immer neuer ist Stoyan Mihov vor 8 Jahren 0
Das Ausführen von curl für eine lokale Datei ist nicht sinnvoll. Nur "stat" es. Sami Laine vor 8 Jahren 0
Da OpenELEC keine stat -c hat, musste ich einen anderen Weg gehen. Ihre Antwort funktioniert jedoch für jede andere Linux-Maschine, die ich besitze, also werde ich sie als Antwort auswählen. Ich danke dir sehr! Ich entschied mich für einen Vergleich nach Größe und wenn die Größe gleich ist - nah. Wenn die Größe der lokalen und der entfernten Dateien unterschiedlich ist, wird ein Skript ausgeführt. Folgendes funktionierte für mich '#! / Bin / bash Local = $ (wc -c <file.zip) Remote = $ (curl -sI http: //server/file.zip | awk' / Content-Length / { sub ("\ r", ""); print $ 2} ') if [$ Local! = $ Remote]; dann / bin / bash /storage/scripts/script.sh else echo "Gleiche Größe". fi ' Stoyan Mihov vor 8 Jahren 0
0
Stoyan Mihov

Andere Antworten waren großartig für reguläre Linux-Versionen, funktionierten jedoch nicht für OpenELEC. Also habe ich mich entschieden, stattdessen die Größe zu vergleichen, und es funktioniert wie ein Zauber! Hier ist der Code:

#!/bin/bash Local=$(wc -c < file.zip) Remote=$(curl -sI http://server/file.zip | awk '/Content-Length/ ') if [ $Local != $Remote ]; then /bin/bash /storage/scripts/script.sh else echo "Same size." fi