MikeDreamer
Anmeldungsdatum: 11. September 2011
Beiträge: 52
|
Hallo, ich habe mein erstes Shell Script für eine Backuplösung erstellt, das auch funktioniert, wenn man es zum ersten den Monats startet.
Grundsätzlich funktioniert es auch wenn man es am vorletzten Tag der ersten Monatswoche startet. Da es keine Möglichkeit gibt, in der Shell die Woche eines Monats zu berechnen wird geprüft, ob es schon einen Ordner gibt, der "Woche_1" heißt.
Wenn nicht, dann wird er erstellt und das Script nimmt an, das man sich im Zeitraum der ersten Woche des Monats befindet und legt dort eine Wochensicherung ab. Ich möchte gerne die Daten für einen Monat in Wochensicherungen vorhalten, bevor sich die 4 oder 5 Wochensicherungen zu einer Monatssicherung verschmelzen und die Verzeichnisse der Wochen wieder gelöscht werden. Lange habe ich überlegt und mir fällt derzeit nichts ein, wie ich das Problem lösen könnte.
Manchmal hat eine Monat 4 Wochen, und manchmal so wie diesen Monat gibt es 5 Wochen und der 1 August ist auf einem Samstag. Die Überlegung geht dann auch dahin, ob man sich nach dem Monaten richten soll, oder gezielt nach den Wochentagen?
Bei Wochentagen und Wochen des Jahres könnte man aus date ermitteln lassen, da diese Werte zurück gegeben werden. Will man aber strikt nach Monaten trennen, so wäre der Zeitraum vom 27.07.2015 bis 31.07.2015 eine Sicherung von 5 Tagen.
Die erste Wochensicherung mit den Inhalt von 01.08.2015 bis 02.08.2015 wäre dann allerdings eine Wochensicherung mit einem Inhalt von nur 2 Tagen. Vielleicht hat ja jemand eine Idee, was sinnvoll wäre? Vielen Dank
Mike
Moderiert von redknight: Ins korrekte Forum verschoben, das man hätte am Namen BACKUP erkennen können.
|
redknight
Moderator & Supporter
Anmeldungsdatum: 30. Oktober 2008
Beiträge: 21730
Wohnort: Lorchhausen im schönen Rheingau
|
Ich würde an deiner Stelle die jeweil erste Wochensicherung im Monat als Monatssicherung hernehmen.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
Da es keine Möglichkeit gibt, in der Shell die Woche eines Monats zu berechnen wird geprüft, ob es schon einen Ordner gibt, der "Woche_1" heißt.
Mir ist nicht ganz klar was Du willst und meinst. Was soll das sein, die Woche eines Monats? Die Woche des Monats Juli? Soll das Skript die Woche für einen bestimmten Tag, das jeweilige Heute, ermitteln? Kennst Du den cron-Scheduler?
Grundsätzlich funktioniert es auch wenn man es am vorletzten Tag der ersten Monatswoche startet.
Aber nicht am letzten Tag der ersten Monatswoche? Nicht am vorletzten Tag der zweiten Monatswoche?
Ich möchte gerne die Daten für einen Monat in Wochensicherungen vorhalten, bevor sich die 4 oder 5 Wochensicherungen zu einer Monatssicherung verschmelzen und die Verzeichnisse der Wochen wieder gelöscht werden. Lange habe ich überlegt und mir fällt derzeit nichts ein, wie ich das Problem lösen könnte. Manchmal hat eine Monat 4 Wochen, und manchmal so wie diesen Monat gibt es 5 Wochen und der 1 August ist auf einem Samstag.
Soll das Script immer Samstags laufen? Wenn der Tag im Oktober ist, dann speicher es als Oktober_x, selbst wenn es der 1. August ist und der Hauptteil sind Daten vom Juli. Wenn Du das Backup brauchst, dann wohl kurz nach der Erstellung, oder? Und dann ist es leicht rauszufinden, dass das ein Samstag war. Den Tag der Woche liefert auch date +%u . Wenn die Sicherung für die Werktage Mo-Fr ist, und immer Samstag laufen soll, und die Zahl kleiner als 6 ist, sind die Daten immer aus 2 Monaten. Solche Daten könntest Du natürlich auch in beiden Monatssicherungen speichern.
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
MikeDreamer schrieb: Da es keine Möglichkeit gibt, in der Shell die Woche eines Monats zu berechnen ...
Wieso gibt's die nicht ?? Mit date geht das sehr wohl: echo $(( $(date +%V) - $(date +%V -d -$(date +%ddays)) +1 )) Lies mal in man date nach ! LG, track
|
MikeDreamer
(Themenstarter)
Anmeldungsdatum: 11. September 2011
Beiträge: 52
|
Vielen Dank für die Lösung mittels date. ich habe selbst probiert mit den Informationen von date die entsprechende Woche zu ermitteln.
Leider hatte ich es nicht geschafft.
Das ich die Formel auch verstehen kann würde ich gerne wissen wie genau Du das gemacht hast. Ich habe dazu die --help und eine Seite im Netz herangezogen.
http://www.flashsystems.de/articles/1521 | echo $(( $(date +%V) - $(date +%V -d -$(date +%ddays)) +1 ))
|
%V ISO‐Wochennummer mit Montag als erstem Tag der Woche (01..53)
%d Tag des Monats (z. B. 01) %%days hatte ich nirgends gefunden und beim Ausführen wurde mir 19days angezeigt.
Scheinbar ist das der Tag des Monats! Vielleicht wärst Du so nett und mir das etwas detaillierter dar zu stellen. | (Woche 38 im Jahr - ( 38 -d 19days im September))+1
|
Danke
Mike
|
Vej
Moderator, Supporter
Anmeldungsdatum: 7. März 2013
Beiträge: 3391
|
Hallo MikeDreamer. Du hast es schon fast geschafft: MikeDreamer schrieb: | echo $(( $(date +%V) - $(date +%V -d -$(date +%ddays)) +1 ))
|
%V ISO‐Wochennummer mit Montag als erstem Tag der Woche (01..53)
%d Tag des Monats (z. B. 01)
Dementsprechend funktioniert das wie folgt: date +%V gibt die Wochennummer im Jahr
date +%d gibt den Tag des Monats an
date +%V -d -XYdays gibt die Wochennummer an dem Tag an, der XY Tage vor dem heutigen Tag lag.
Aus 2. und 3. zusammengenommen entsteht dann date +%V -d -$(date +%ddays) , was die Wochenanzahl (bezogen auf das Jahr) zum Monatsbeginn liefert. Subtrahiert man das Ergebnis aus 4. nun von dem Ergebnis von 1. und addiert 1 (für die "aktuelle" Woche) erhält man die Wochen im Monat: $(date +%V) - $(date +%V -d -$(date +%ddays)) + 1
Ich hoffe das hilft etwas weiter. Viele Grüße Vej
|
MikeDreamer
(Themenstarter)
Anmeldungsdatum: 11. September 2011
Beiträge: 52
|
Hallo, @Vej
ich hoffe, das ich mich jetzt nicht in die Ecke stellen und schämen muss, aber ich kapier das immer noch nicht.
Anscheinend bin ich zu blöd dafür? Ich habe Deine Formel in die Shell eingegeben.
| echo $(( $(date +%V) - $(date +%V -d -$(date +%ddays)) +1 ))
|
Das Ergebnis für heute (23.01.2016) war -49, laut Kalender befinden wir und in der 4ten Woche. Dann hab eich folgende Befehlsfolgen probiert um zu verstehen, das dabei raus kommt.
und erhielt 03 Da ich aber nicht wusste was die -d bedeutet habe ich folgendes ausprobiert.
| echo $(( $(date +%V) -d ))
|
und erhielt 3, also eine einstellige Zahl ?!? Da eine 4 heraus kommen müsste, habe ich dann folgendes Probiert
| echo $(( $(date +%V) -d +1 ))
|
Und da haben wir dann die 4, aber warum das ganze mit der Subtraktion? Wenn ich die Formel noch mal anschaue
$(date +%V) - $(date +%V -d -$(date +%ddays)) +1
3Wo - (3Wo +23Tg +1) = 24tg ??? wäre Super wenns bitte noch mal erklären kann und vielleicht auch mit Zahlen, das wäre super.
Vielen Dank
Mike
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Oha. Führende Nullen sind in der Shell Arithmetik immer eine böse Falle ! - solche Zahlen werden nämlich automatisch als oktal verstanden. Wenn Du wirklich rechnen willst, müsstest Du auf jeden Fall ein "10#" davor setzen, um "dezimal" zu erzwingen: track@track:~$ echo $(( 08 + 01 ))
bash: 08: Der Wert ist zu groß für die aktuelle Basis. (Fehlerverursachendes Zeichen ist \"08\").
track@track:~$ echo $(( 10#08 + 01 ))
9 In Deiner ursprünglichen Frage wolltest Du ja nur wissen, ob es die 1. Woche im Monat ist. Das erspart einem die Rechnerei: ( und beim Jahreswechsel brauchst Du dann auch nicht herumzutricksen ! ) track@track:~$ mon=$( date +%Y-%m )
track@track:~$ if [ $(date +%V) = $(date -d $mon-01 +%V) ] ; then echo "1. Woche"; fi
track@track:~$ if [ $(date -d "22 days ago" +%V) = $(date -d $mon-01 +%V) ] ; then echo "1. Woche"; fi
1. Woche So ähnlich machen sie es auch auf Stack Overflow. LG, track
|
MikeDreamer
(Themenstarter)
Anmeldungsdatum: 11. September 2011
Beiträge: 52
|
Im Grunde möchte ich den heutigen Tag als Datum nehmen und errechnen lassen in welcher Woche sich das Datum sich befindet.
Ist es die 1. Woche, die 2. Woche, 3., 4. oder 5. Woche in einem Monat. Damit wäre ich eigentlich am Ziel
| echo $(( $(date +%V) -d +1 ))
|
Ergibt 4 Ich verstehe aber die vorhergehende Formel von Vej nicht ganz, daher hatte ich noch mal angefragt.
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Das Problem mit der 1. Januarwoche ist grundsätzlich, dass sie als 53. Woche des Vorjahres gerechnet wird ! So oder so musst Du dafür eine Fallunterscheidung treffen, um das Problem in den Griff zu kriegen (denn der 31. Dezember gehört ja sehr wohl zur 53. Woche !) Und wenn Du wissen willst, was die Shell Arithmetik sieht, brauchst Du Dir nur mal die Rohausgabe anzusehen: track@track:~$ echo $(date +%V) - $(date +%V -d -$(date +%ddays)) +1
03 - 53 +1
LG, track
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Gerade ist mir noch ein anderer Ansatz eingefallen, der die ganze Wochentrickserei vermeidet und nur mit den Tagen rechnet: echo $(( 10#$( date +%d) / 7 +1 )) Dabei sind der 29.-31. des Monats dann natürlich die "5. Woche". Falls Du es z.B. auf "nächsten Sonntag" normieren willst, ginge das auch: echo $(( 10#$(date -d sunday +%d) / 7 +1 ))
Aber es bleibt natürlich die Frage, wie Du mit den Monatswechseln umgehen willst. LG, track
|
MikeDreamer
(Themenstarter)
Anmeldungsdatum: 11. September 2011
Beiträge: 52
|
Da ich wöchentliche Backups zusammenfasse, möchte ich die Sonntage überprüfen und feststellen in welcher Woche des Monats der jeweilige Sonntag ist. Der Monat enthält manchmal 4 Wochen, oder auch 5. Und nur diese Zahlen (1-5) möchte ich im jeweiligen Monat ermitteln. Im Januar sind es 5, Im Februar sind es 4, im März sind es ebenfalls 4. Diese Werte möchte ich jeweils ermitteln.
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Ist schon klar. Aber was machst Du z.B. nächstes Jahr in der letzten Januarwoche ? Der 31. Jan. ist dann ein Dienstag. Soll Mo / Di als 5. Januarwoche gelten, und der Rest der Woche dann als 1. Februarwoche ? Bei meinem Beispiel mit "nächstem Sonntag" würde z.B. die ganze Woche schon dem Februar zugeschlagen. In der Hinsicht musst Du Deine Strategie nochmal genau formulieren. Dann kann man das auch in Code gießen ... 😀 LG, track
|
MikeDreamer
(Themenstarter)
Anmeldungsdatum: 11. September 2011
Beiträge: 52
|
Da ich Wochenabschnitte verfolge und hauptsächlich Sonntags prüfe, würde 2017 die erste Wochensicherung am 5.1.2017 sein.
Hier habe ich mal einen Programmablaufplan.
http://www.synology-forum.de/showthread.html?72245-Muss-Raid-wirklich-sein/page2&p=589409&viewfull=1#post589409 Im Prinzip mache ich tägliche Backups von Mo- So in einzelnen Verzeichnissen.
Am Sonntag wird alles zu einem Wochenbackup zusammengefasst (Wo1-Wo4 oder Wo5)
Die Tagessicherungen werden dann alle gelöscht.
Es folgen dann wieder die Tagessicherungen in Ihren eigenen Verzeichnissen.
Am nächsten Sonntag wird wieder eine Wochensicherung gemacht (Wo2) Um jetzt heraus zu finden welches Wochenbackup denn jetzt geschrieben werden muss, muss ermittelt werden in welcher Woche des Monats sich jetzt dieser Sonntag befindet. Morgen ist der Sonntag in der 4ten Woche, also wäre das dann die Sicherung "Wo4".
Ob es jetzt noch ein Backup in Wo5 für diesen Monat gibt würde dann am Nächsten Sonntag ermittelt werden. Im Februar ist es so, das es dann nur 4 Wochensicherungen sein werden. Ich weis nicht, ob das so relevant, wenn ein Monatswechsel mitten in der Woche liegt das jetzt noch auf zu teilen. Der Cronjob besagt, das die Datensicherung jeweils Sonntags durchgeführt wird. Dann müsste der Cronjob noch geändert werden. Ich würde der Wochensicherung treu bleiben.
Allerdings bin ich nicht der Backup-Spezialist.
|
Seebär
Anmeldungsdatum: 2. Mai 2009
Beiträge: 829
|
Warum machst Du es Dir so schwer? Bisher ist das ja eher ein Exkurs über shell-Datumsrechnerei. Dein Ziel war was: eine Sicherung?
Dann kannst Du z.B. Borg-Backup verwenden (steht nicht im Wiki, wäre es aber b.G. mal wert). Inkrementell deduplizierend Backups kann man bei Bedarf mounten Ziel könnte sogar eine ntfs-Platte sein, ohne dass Attribute die ntfs nicht kennt (und das ist ein Sack voll) verloren gehen. Falls das wichtig sein sollte.
|