Erledigt Benötige Hilfe beim ändern von Bash-Script

Hans Bear

unsichtbar
Hallo,

Ich würde gerne ein Bash-Script ein wenig anpassen und komme mangels Wissen nicht weiter.
Ich weiß leider auch nicht welche Suchbegriffe ich bei Google eingeben muss.
Bestimmt weiß das hier jemand.

Es geht um dieses Backup-Script: https://github.com/mattanja/rsync-backup-and-rotate

Und zwar legt mir dieses Script meine Backups in Unterverzeichnissen ab. daily.0 , daily.1 daily.2 usw.

Ich hätte gerne daily.000 daily.001, daily.002 usw.. Mein Beispiel unten geht von 00 01 02 aus, allerdings dachte ich mir
bei 100 Backups brauche ich drei Stellen.

Also habe ich mir mal das Backup- und das Rotate-script angesehen und versucht anzupassen.

Leider läuft es nicht so recht aber ich denke ich weiß warum.


Code:
# Shift all other daily backups ahead one day

for OLD in 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01; do
    if [ -d $DATA_PATH/$SERVER/daily.$OLD ] ; then
        NEW=$[ $OLD + 1 ]
        # Backup last date
        touch $DATA_PATH/.timestamp -r $DATA_PATH/$SERVER/daily.$OLD
        mv $DATA_PATH/$SERVER/daily.$OLD $DATA_PATH/$SERVER/daily.$NEW

#        mv $DATA_PATH/$SERVER/daily.$OLD $DATA_PATH/$SERVER/daily.$NEW

        # Restore timestamp
        touch $DATA_PATH/$SERVER/daily.$NEW -r $DATA_PATH/.timestamp
    fi
done
und zwar geht es denke ich darum : NEW=$[ $OLD + 1 ]

Um es auf den Punkt zu bringen: die Bash rotiert mir daily.01 zu daily.2 anstatt zu daily.02.
Wenn es daily.02 allerdings schon gibt läuft alles durch. im Script anstatt "+1" "+01" einzutragen bringt gar nix.

Mag mir jemand bitte helfen?

Über antworten freue ich mich.

Hans
 

Hans Bear

unsichtbar
danke DrSnuggles. Ja über so was ähnliches bin ich bei meiner Recherche auch gestoßen.
Leider weiß ich trotzdem nicht was ich da jetzt machen soll. Habe da leider null Hintergrundwissen.
 

Hans Bear

unsichtbar
Irgendwie bin ich mit meinem Beitrag unzufrieden.
Hier ist mal ein Script was mein Problem demonstriert:
#!/bin/bash
if ! [ -d "daily.0"] ; then
mkdir daily.0
# ...
fi


# Shift all other daily backups ahead one day
for OLD in 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ; do
if [ -d daily.$OLD ] ; then
NEW=$[ $OLD + 1 ]
# Backup last date
touch .timestamp -r daily.$OLD
mv daily.$OLD daily.$NEW

# mv $DATA_PATH/$SERVER/daily.$OLD $DATA_PATH/$SERVER/daily.$NEW

# Restore timestamp
touch daily.$NEW -r .timestamp
fi
done

Wenn mann dieses Script immer wieder ausführt wird immer ein neues Verzeichnis angelegt.
von 1 bis 10 ist der Zahlenblock immer einziffrig. Wie oben ja schon gesagt ist das so nicht gewünscht.

@DrSnuggles was genau aus deinem Link müsste ich denn wo in meinem Script einfügen?
 

DrSnuggles

Bekanntes Mitglied
War das jetzt wirklich sooooooooo schwer?

Code:
for OLD in 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ; do
->
for OLD in {049..001}; do
 

pSB

Pinguiner
von 1 bis 10 ist der Zahlenblock immer einziffrig. Wie oben ja schon gesagt ist das so nicht gewünscht.
Für führende Nullen kannst Du printf verwenden:
Code:
NEW=$(printf %02u $[ $OLD + 1 ])
Code:
for OLD in {49..0}; do NEW=$(printf %02u $[ $OLD + 1 ]); echo -n "$NEW "; done
50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01
 

dr_tommi

alter Oldie
Warum so kompliziert?
Vielleicht weil 001 + 1 nicht 002 sondern 2 ist und somit das Verzeichnis in daily.2 umbenannt wird und nicht in daily.002?
Die Nullen in der Schleife zu haben reicht nicht aus.
Also Laufvariable ohne führende Nullen, daraus dann z.B. mit "printf" die Zeichenketten für OLD und NEW erzeugen und damit testen, anlegen und umbenennen.
 

DrSnuggles

Bekanntes Mitglied
Hab das Script nicht weiter gelesen.
Hatte nur die Aufgabe Padde I wargenommen.

Ja, dann ist die Lösung von pSB natürlich die sinnvollste, steht allerdings auch in dem Stackoverflow-artikel ...
 

dr_tommi

alter Oldie
So in etwa müsste es funktionieren.
Code:
#!/bin/bash
# Shift all other daily backups ahead one day
for i in {49..0}; do
    OLD=$(printf %03u $[ $i ])
    if [ -d daily.$OLD ] ; then
        NEW=$(printf %03u $[ $i + 1 ])
        # Backup last date
        touch .timestamp -r daily.$OLD
        mv daily.$OLD daily.$NEW
                # mv $DATA_PATH/$SERVER/daily.$OLD $DATA_PATH/$SERVER/daily.$NEW
                # Restore timestamp
        touch daily.$NEW -r .timestamp
    fi
done
I als Laufvariable zählt von 49 bis 0 runter.
OLD = I und NEW =I+1 mit 3 Stellen (wegen %03)

Ein vorhandenes Verzeichnis daily.001 wird in daily.002 umbenannt und daily.000 in daily.001.
Also alle vorhandenen Verzeichnisnamen werden um 1 erhöht.
 

ibinsfei

Team (Technik) - BOFH
Mitarbeiter
Code:
#!/bin/bash
# Shift all other daily backups ahead one day
for i in {49..0}; do
    OLD=$(printf %03u $[ $i ])
    if [ -d daily.$OLD ] ; then
        NEW=$(printf %03u $[ $i + 1 ])
        # Backup last date
        touch .timestamp -r daily.$OLD
        mv daily.$OLD daily.$NEW
                # mv $DATA_PATH/$SERVER/daily.$OLD $DATA_PATH/$SERVER/daily.$NEW
                # Restore timestamp
        touch daily.$NEW -r .timestamp
    fi
done
Ich empfehle bash-Variablen grundsätzlich mit {} zu verwenden, denn es kann sonst passieren, dass die Variable nicht aufgelöst wird. Im obigem script ist dies zwar nicht der Fall, aber wenn man mal was ändert und nicht auspasst, kann es Probleme geben. Beispiel:
Code:
TODAY=date +"%Y%m%d"
mv mylogfile $TODAY.mylogfile.sic
Das funktioniert, weil ein Punkt kein Teil einer Variable sein kann und deswegen $TODAY richtig aufgelöst wird.
Code:
TODAY=date +"%Y%m%d"
mv mylogfile $TODAY_mylogfile.sic
Das funktioniert nicht, da versucht wird $TODAY_mylogfile aufzulösen und deswegen mylogfile in .sic umbenannt wird. So funktioniert es aber wieder:
Code:
TODAY=date +"%Y%m%d"
mv mylogfile ${TODAY}_mylogfile.sic
 

Brian

Username
Man braucht kein printf für die führende Null, dass kann die Bash auch von alleine:
statt:
Code:
{48..0}
einfach:
Code:
{48..00}
 

dr_tommi

alter Oldie
Man braucht kein printf für die führende Null, dass kann die Bash auch von alleine:
statt:
Code:
{48..0}
einfach:
Code:
{48..00}
Lies dir in Ruhe nochmal Beitrag #8 durch und denke mal darüber nach.
Es ging nicht um die Laufvariable sondern um eine Addition.
00+1 ist leider bei bash nicht 01 sondern 1.

Es ging nicht darum was bash kann und was nicht, sondern wie man das Ergebnis einer Addition mit einer beliebigen Anzahl führender Nullen darstellen kann.
Und dazu braucht man printf oder eine andere formatierte Ausgabe.
 
Oben Unten