Rotering af gunzippede filer (løst)
-
- Admin
- Indlæg: 3650
- Tilmeldt: 5. mar 2010, 19:58
- IRC nickname: nicky
- Geografisk sted: 192.168.20.42
Rotering af gunzippede filer (løst)
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 Det vil ikke være de eneste filer der ligger i mapperne.
I princippet kan roteringen udtrykkes ret let
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 $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?
Kode: Vælg alt
dump.sql.gz.1
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
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?
-
- Redaktør
- Indlæg: 5515
- Tilmeldt: 26. apr 2008, 20:52
- IRC nickname: laoshi
- Geografisk sted: Vejle
Re: Rotering af gunzippede filer
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
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
-
- Admin
- Indlæg: 3650
- Tilmeldt: 5. mar 2010, 19:58
- IRC nickname: nicky
- Geografisk sted: 192.168.20.42
Re: Rotering af gunzippede filer
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.
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.
-
- Admin
- Indlæg: 3650
- Tilmeldt: 5. mar 2010, 19:58
- IRC nickname: nicky
- Geografisk sted: 192.168.20.42
Re: Rotering af gunzippede filer
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.
Tak for hjælpen laoshi, dit indlæg trak mig i den rigtige retning.
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.
-
- Admin
- Indlæg: 3650
- Tilmeldt: 5. mar 2010, 19:58
- IRC nickname: nicky
- Geografisk sted: 192.168.20.42
Re: Rotering af gunzippede filer (løst)
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
Outputtet bliver så (for scriptet i det tidligere indlæg)
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
-
- Redaktør
- Indlæg: 5515
- Tilmeldt: 26. apr 2008, 20:52
- IRC nickname: laoshi
- Geografisk sted: Vejle
Re: Rotering af gunzippede filer (løst)
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
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
Hvem er online
Brugere der læser dette forum: Ingen og 1 gæst