Rotering af gunzippede filer (løst)

Dette forum bruges på EGET ANSVAR til at lege med scripts og andre ting med risiko for at beskadige sit eget og andres systemer.
Brugeravatar
NickyThomassen
Admin
Indlæg: 3652
Tilmeldt: 5. mar 2010, 19:58
IRC nickname: nicky
Geografisk sted: 192.168.20.42

Rotering af gunzippede filer (løst)

Indlæg af NickyThomassen »

Jeg sidder og konstruere et backupscript i bash, som 3 gange kommer til at skulle rotere gunzippede filer. I destinationsmapperne vil filerne ligge med et nummer efter filendelsen, i det her format

Kode: Vælg alt

dump.sql.gz.1
Det vil ikke være de eneste filer der ligger i mapperne.

I princippet kan roteringen udtrykkes ret let

Kode: Vælg alt

   if [ -e "/home/backup/dump.sql.gz.3" ] ; then
      mv /home/backup/dump.sql.gz.3 /home/backup/dump.sql.gz.4
   fi
   if [ -e "/home/backup/dump.sql.gz.2" ] ; then
      mv /home/backup/dump.sql.gz.2 /home/backup/dump.sql.gz.3
   fi
   if [ -e "/home/backup/dump.sql.gz.1" ] ; then
      mv /home/backup/dump.sql.gz.1 /home/backup/dump.sql.gz.2
   fi

Men er det ikke muligt at gøre det bedre? Alene det at koden fylder meget og ikke er fleksibel syntes jeg er et problem, men jeg ville også gerne at koden var tolerant overfor fejl, som fx det at den tjekker om dumpet findes inden den prøver på at omdøbe filen.

Jeg kigger på en "for - in - do", opbygget sådan her, til at gøre arbejdet

Kode: Vælg alt

for x in "$LIST" ; do
   if [ "$x" = "dump.sql.gz.[1-7]" ] ; then
      mv $x (og her skal filnavnet hæves med 1)
   fi
done
$LIST har jeg prøvet som forskellige udgaver af "ls -lr" osv.

Problemet med den kode er at den ganske enkelt ikke virker, og jeg har også prøvet med en simplere opbygning, hvor "if" skal matche et bestemt dump, og slette det. Det virkede heller ikke.

"ls" virker desuden ikke som forventet, for lige meget hvilket flag jeg bruger, så er outputtet på 1 linie, og det kan "if" åbenbart ikke matche til noget.

---

Så spørgsmålet er, hvad er den bedste kurs herfra:
Hvordan kan en liste over de filer der skal roteres, blive givet videre til "for" i et format den kan bruge?
Kan "for" konstruktionen overhovedet reddes?
At bruge en "while" eller noget tredje i stedet, og i givet fald, hvilken og hvorfor?
Eller måske logrotate?
laoshi
Redaktør
Indlæg: 5515
Tilmeldt: 26. apr 2008, 20:52
IRC nickname: laoshi
Geografisk sted: Vejle

Re: Rotering af gunzippede filer

Indlæg af laoshi »

Umiddelbart tror jeg jeg ville bruge logrotate som er bygget til formålet. Mon ikke det er lettere, og sikrere, at lære logrotates syntaks end selv at konstruere et script?
"Von guten Mächten wunderbar geborgen
erwarten wir getrost was kommen mag.
Gott ist mit uns am Abend und am Morgen
Und ganz gewiss an jedem neuen Tag"

(Dietrich Bonhoeffer 1906-1945)

http://www.stromata.dk
https://wiki.ubuntu.com/FlemmingChristensen
https://launchpad.net/~laoshi
Brugeravatar
NickyThomassen
Admin
Indlæg: 3652
Tilmeldt: 5. mar 2010, 19:58
IRC nickname: nicky
Geografisk sted: 192.168.20.42

Re: Rotering af gunzippede filer

Indlæg af NickyThomassen »

Jamenøh, det følgende kommer til at lyde stærkt selvmodsigende, især når jeg selv nævnte logtotate.

Umiddelbart er jeg enig, at programmere logrotering i bash, kan virke lidt som at opfinde den dybe tallerken igen. Heldigvis kan jeg uddybe lidt

* At lave scriptet med så få eksterne afhængigheder sænker vedligeholdelsesarbejdet på sigt

* Selvom logrotate er ret standard, så er det stadig et program mere, vis funktioner og syntax kan ændre sig

* Den egentlige roteringsfunktion ville kun skulle laves én gang; efterfølgende kan den kopieres

* Kunne det laves med "for - in -do", så vil det sikkert fylde det samme i scriptet som at kalde logrotate med diverse parametre

Så selvom logrotate er en god løsning, så vil jeg helst kun bruge den hvis der ikke er nogen anden udvej, og selv der kunne jeg godt finde på at bruge "if [ -e ... ] i stedet for. Jeg hentede i øvrigt kildekoden til logrotate, men det er skrevet i C, og det rækker mine evner desværre ikke til.
Brugeravatar
NickyThomassen
Admin
Indlæg: 3652
Tilmeldt: 5. mar 2010, 19:58
IRC nickname: nicky
Geografisk sted: 192.168.20.42

Re: Rotering af gunzippede filer

Indlæg af NickyThomassen »

Yes, I did it :)

Det tog en konstruktion opbygget i "while - do", og så nogle variabler som loopet kan bruge under kørslen. Det kan sikkert gøres bedre, men jeg er fint tilfreds.

Kode: Vælg alt

#!/bin/bash
# Arbejdsmappe til opgaven
DIR="/home/titanus/Skrivebord/for_test"
# Ikke rigtig nødvendigt til en test, men god i det færdige script
if [ ! -d $DIR ] ; then
   echo "Dir findes ikke"
   exit 10
fi

# Denne variabel kan fx sættes i toppen, og bruges som en simpel indstilling for hvor mange filer der skal gemmes/roteres
ROTATE_LOCAL=5

# Filen med det højeste navn slettes
if [ -e "$DIR/dump.sql.gz.$ROTATE_LOCAL" ] ; then
   rm $DIR/dump.sql.gz.$ROTATE_LOCAL
fi

# Så oprettes arbejdsvariabel nummer 2, med samme værdi som $ROTATE_LOCAL,
# og der trækkes 1 fra $ROTATE_LOCAL
ROTATE_LOOP=$ROTATE_LOCAL
ROTATE_LOCAL=$((ROTATE_LOCAL-1))

# Resten roteres så til et filnavn som er 1 højere end før
while [ $ROTATE_LOCAL -ne 0 ] ; do
   if [ -e "$DIR/dump.sql.gz.$ROTATE_LOCAL" ] ; then
   mv $DIR/dump.sql.gz.$ROTATE_LOCAL $DIR/dump.sql.gz.$ROTATE_LOOP
   fi
ROTATE_LOCAL=$((ROTATE_LOCAL-1))
ROTATE_LOOP=$((ROTATE_LOOP-1))
done

Tak for hjælpen laoshi, dit indlæg trak mig i den rigtige retning.
Brugeravatar
NickyThomassen
Admin
Indlæg: 3652
Tilmeldt: 5. mar 2010, 19:58
IRC nickname: nicky
Geografisk sted: 192.168.20.42

Re: Rotering af gunzippede filer (løst)

Indlæg af NickyThomassen »

Jeg glemte at nævne hvordan jeg kom frem til løsningen.

Et af de steder hvor jeg søgte inspiration til løsningen, der blev en gut anbefalet at bruge verbose output når han afviklede scriptet, og det gjorde også forskellen for mig.

Kommandoen er ganske enkelt at sætte "bash -x" foran sit script, så man afvikler det sådan her

Kode: Vælg alt

bash -x script_navn

Outputtet bliver så (for scriptet i det tidligere indlæg)

Kode: Vælg alt

+ DIR=/home/titanus/Skrivebord/for_test
+ '[' '!' -d /home/titanus/Skrivebord/for_test ']'
+ ROTATE_LOCAL=5
+ '[' -e /home/titanus/Skrivebord/for_test/dump.sql.gz.5 ']'
+ ROTATE_LOOP=5
+ ROTATE_LOCAL=4
+ '[' 4 -ne 0 ']'
+ '[' -e /home/titanus/Skrivebord/for_test/dump.sql.gz.4 ']'
+ mv /home/titanus/Skrivebord/for_test/dump.sql.gz.4 /home/titanus/Skrivebord/for_test/dump.sql.gz.5
+ ROTATE_LOCAL=3
+ ROTATE_LOOP=4
+ '[' 3 -ne 0 ']'
+ '[' -e /home/titanus/Skrivebord/for_test/dump.sql.gz.3 ']'
+ mv /home/titanus/Skrivebord/for_test/dump.sql.gz.3 /home/titanus/Skrivebord/for_test/dump.sql.gz.4
+ ROTATE_LOCAL=2
+ ROTATE_LOOP=3
+ '[' 2 -ne 0 ']'
+ '[' -e /home/titanus/Skrivebord/for_test/dump.sql.gz.2 ']'
+ mv /home/titanus/Skrivebord/for_test/dump.sql.gz.2 /home/titanus/Skrivebord/for_test/dump.sql.gz.3
+ ROTATE_LOCAL=1
+ ROTATE_LOOP=2
+ '[' 1 -ne 0 ']'
+ '[' -e /home/titanus/Skrivebord/for_test/dump.sql.gz.1 ']'
+ mv /home/titanus/Skrivebord/for_test/dump.sql.gz.1 /home/titanus/Skrivebord/for_test/dump.sql.gz.2
+ ROTATE_LOCAL=0
+ ROTATE_LOOP=1
+ '[' 0 -ne 0 ']'
+ exit 0
laoshi
Redaktør
Indlæg: 5515
Tilmeldt: 26. apr 2008, 20:52
IRC nickname: laoshi
Geografisk sted: Vejle

Re: Rotering af gunzippede filer (løst)

Indlæg af laoshi »

TitanusEramius skrev:Tak for hjælpen laoshi, dit indlæg trak mig i den rigtige retning.

Hvilket viser at det ikke er altid man kan forudse følgerne af ens handlinger!
"Von guten Mächten wunderbar geborgen
erwarten wir getrost was kommen mag.
Gott ist mit uns am Abend und am Morgen
Und ganz gewiss an jedem neuen Tag"

(Dietrich Bonhoeffer 1906-1945)

http://www.stromata.dk
https://wiki.ubuntu.com/FlemmingChristensen
https://launchpad.net/~laoshi