Kod: Markera allt
FOLDERLIST=här ska det vara en lista med mappar, men hur?
rsync -aq --compare-dest=$FOLDERLIST $SOURCEDIR $TARGETDIR
Kod: Markera allt
FOLDERLIST=här ska det vara en lista med mappar, men hur?
rsync -aq --compare-dest=$FOLDERLIST $SOURCEDIR $TARGETDIR
Vidar Madsen skrev: First full backup:
First incremental:Kod: Markera allt
rsync -a somedir full-20040415/
Second incremental, on top of first:Kod: Markera allt
rsync -a --compare-dest=../full-20040415 somedir incr-20040416/
The args must be given in the correct order; Latest incremental first, last resort last.Kod: Markera allt
rsync -a --compare-dest=../incr-20040416 --compare-dest=../full-20040415 somedir incr-20040417/
[/quote]Konservburk skrev:Killen som skrivit den patchen kom med följande exempel:
The args must be given in the correct order; Latest incremental first, last resort last.Kod: Markera allt
rsync -a --compare-dest=../incr-20040416 --compare-dest=../full-20040415 somedir incr-20040417/
Kod: Markera allt
mkdir live
touch live/a live/b live/c
rsync -a live/ 0
sleep 1
touch live/a
rsync -a --compare-dest=../0 live/ 1
sleep 1
touch live/b
rsync -a --compare-dest=../1 --compare-dest=../0 live/ 2
Kod: Markera allt
$ ls 0 1 2 live
0:
a b c
1:
a
2:
b
live:
a b c
Tack för att du engagerar dig, men tyvärr hänger jag inte riktigt med. Jag kanske borde sagt att jag är nybörjare av värsta sorten på Linux, Ubuntu och bash-scriptning...Konservburk skrev:Jag tror inte riktigt jag förstår vad du menar. Vi tar ett exempel så kanske det klarnar lite:
Och så kollar vi vad som har hänt:Kod: Markera allt
mkdir live touch live/a live/b live/c rsync -a live/ 0 sleep 1 touch live/a rsync -a --compare-dest=../0 live/ 1 sleep 1 touch live/b rsync -a --compare-dest=../1 --compare-dest=../0 live/ 2
Jag tycker det ser rätt ut.Kod: Markera allt
$ ls 0 1 2 live 0: a b c 1: a 2: b live: a b c
Kod: Markera allt
rsync --compare-dest=../Fullbackup Sourcemapp Targetmapp_datum1
Kod: Markera allt
rsync --compare-dest=../Fullbackup --compare-dest=../Targetmapp_datum1 Sourcemapp Targetmapp_datum2
Kod: Markera allt
rsync -a orginalet/ full_backup
Kod: Markera allt
rsync -a --compare-dest=../full_backup orginalet/ ny_backup
Kod: Markera allt
rsync -a --compare-dest=../ny_backup --compare-dest=../full_backup orginalet/ nyare_backup
Så här:Konservburk skrev:Du säger att det inte fungerar? Men jag tyckte att det verkade funka precis som du ville ha det:
Så vad är du missnöjd med?
För mig ser rsync att d redan finns i dag DAG_2 så den kopierar bara e till DAG_3. Det var så du ville ha det, eller hur?Majo skrev:Ny fil är e men tyvärr kopieras både d och e till mappen DAG_3, när rsync med hjälp av compare-dest borde se att d redan finns i DAG_2
4) När hela varvet har gått runt (upp till 31 dagar) ligger alltså filen d i trettio mappar (filen e i 29 mappar, f i 28...etc). Inte min idé om inkrementell backup.
Kod: Markera allt
mkdir live
touch live/a live/b live/c
rsync -a live/ DAG_1
touch live/d
rsync -a --compare-dest=../DAG_1 live/ DAG_2
touch live/e
rsync -a --compare-dest=../DAG_2 --compare-dest=../DAG_1 live/ DAG_3
ls DAG_1 DAG_2 DAG_3 live
Kod: Markera allt
DAG_1:
a b c
DAG_2:
d
DAG_3:
e
live:
a b c d e
Ok, tack för allt jobb du lagt ned. Men hur ser jag vilken version av rsync jag har? Och hur uppdaterar jag om versionen är gammal? Med apt-get på nåt sätt, eller?Konservburk skrev:
Om du inte får samma resultat så har du antagligen en annan version av rsync.
Majo skrev:hur ser jag vilken version av rsync jag har?
Kod: Markera allt
$ rsync --version
rsync version 2.6.9 protocol version 29
Copyright (C) 1996-2006 by Andrew Tridgell, Wayne Davison, and others.
<http://rsync.samba.org/>
Capabilities: 64-bit files, socketpairs, hard links, symlinks, batchfiles,
inplace, IPv6, 64-bit system inums, 64-bit internal inums
rsync comes with ABSOLUTELY NO WARRANTY. This is free software, and you
are welcome to redistribute it under certain conditions. See the GNU
General Public Licence for details.
Det var flera problem. Dels hade jag inte kläm på hur man formaterade listan av compare-dest. Jag testade alla möjliga varianter, men eftersom jag hade fel version av rsync i botten, fungerade ju ingen av dem. Eftersom jag inte hittade någon dokumentation hur man formaterade listan, antog jag bara att det fanns nåt annat sätt jag inte hade provat. När du bekräftade hur listan skull se ut, började jag ana att nåt annat var fel och på så sätt kom jag fram till att jag hade version 2.6.3. Det jag tycker är konstigt är att i man-filen för mitt rsync omnämns ju att funktionen kom till i version 2.6.4. Kommer inte man-filen med installationen av programmet? Uppdateras den informationen utan att programmet rsync uppdateras?Konservburk skrev:Nu är jag nyfiken på vad du gjorde för fel förut? Var det bara fel version av rsync, eller var det något annat?
Kod: Markera allt
[b]Köra med cron varje dag, strax efter midnatt.[/b]
#!/bin/bash
export PATH=$PATH:/bin:/usr/bin:/usr/local/bin
#Mounta måldisken. Kanske bör ha en if-sats här som kollar om den redan är mountad?
mount /dev/sdc1 /mnt/usb-disken
#Flytta till arbetskatalogen
cd /mnt/usb-disken
# Sätta en rad variabler, som källmapp, målmapp och två som loopen använder
SOURCEDIR=/home
TARGETDIR=´date +%d´
let YESTERDAY=`date +%d`-1
LISTPARTS=" --compare-dest=../"
#Loop för att skapa en lista med jämförelsemappar
until [ $YESTERDAY -eq 1 ];
do
if [ $YESTERDAY -lt 10 ]; then TEMP_YD="0$YESTERDAY"; else
TEMP_YD=$YESTERDAY
fi
FOLDERLIST="$LISTPARTS$TEMP_YD"
COMPDEST="$COMPDEST$FOLDERLIST"
YESTERDAY=$[$YESTERDAY-1]
done
# Tömma mappen där inkrementella backupen ska lagras, för att rulla i cykeln.
rm -r `date +%d`
mkdir `date +%d`
#Sätta fler variabler: Sista biten på listan med jämförelsemappar och alternativen för rsync
COMPDEST="$COMPDEST --compare-dest=../full_backup"
ALTS=" -aq $COMPDEST"
#Själva backupkörningen
rsync $ALTS $SOURCEDIR $TARGETDIR
#Gå tillbaka till rootkatalogen
cd
#Unmounta måldisken
umount /dev/sdc1
[b]Full backup, köras med cron den första varje månad:[/b]
#!/bin/sh
export PATH=$PATH:/bin:/usr/bin:/usr/local/bin
#Mounta måldisken
mount /dev/sdc1 /mnt/usb-disken
#Gå till arbetskatalogen
cd /mnt/usb-disken
# mapp som ska backuppas
SOURCEDIR=/home
# mapp för lagring/mottagning
TARGETDIR=full_backup
# Den förra fullbackupen sparas som reserv
rm -r tidigare_fullbackup
mv full_backup tidigare_fullbackup
mkdir full_backup
#Själva backupen
rsync -aq $SOURCEDIR $TARGETDIR
cd
#Unmounta måldisken
umount /dev/sdc1
Kod: Markera allt
COMPDEST="--compare-dest=../full_backup"
for i in $(seq -f%02.f 2 $(date -d-1day +%d))
do COMPDEST="--compare-dest=../$i $COMPDEST"
done
Kod: Markera allt
if test x"$(date +%d)" = x01
then
echo full_backup
else
echo incr_backup
fi
Kod: Markera allt
TARGETDIR=´date +%d´
Kod: Markera allt
TARGETDIR=$(date +%d)
Tack så jättemycket. Ska genast prova alla tips. For-loop har jag meckat med från början, eftersom även jag tyckte det var det bästa alternativet, men jag fick det inte att lira. For-loopen i Bash ser lite annorlunda ut än i andra språk jag använt den i.Konservburk skrev:Den första delen av ditt skript ska ju köras varje dag... men har du tänkt på vad som händer den 1:a varje månad? Jag tycker det ser ut som att skriptet kommer att hamna i en oändlig loop och dra 100% cpu. Inte speciellt bra med andra ord.
Probemet är until-loopen när du skapar listan med jämförelsemappar. Jag hade nog använt mig av en for-loop istället, ungefär så här:
Jag skulle även ha slagit ihop de båda delarna av skriptet till ett enda skript som ska köras varje dag, men göra olika saker beroende på om det är den 1:a i månaden eller inte. Typ så här:Kod: Markera allt
COMPDEST="--compare-dest=../full_backup" for i in $(seq -f%02.f 2 $(date -d-1day +%d)) do COMPDEST="--compare-dest=../$i $COMPDEST" done
Dessutom verkar du ha fnuttarna åt fel håll här:Kod: Markera allt
if test x"$(date +%d)" = x01 then echo full_backup else echo incr_backup fi
Om du använder $() istället så slipper du missa sånt:Kod: Markera allt
TARGETDIR=´date +%d´
Kod: Markera allt
TARGETDIR=$(date +%d)
I t.ex. c/java och liknande så är for-looparna inget annat än förklädda while-loopar, dvs de loopar ända tills något villkor börjar gälla. I sh/bash använder for-loopen istället en lista som den går igenom. När listan är slut är for-loopen klar - så det blir inga oändliga loopar för att man råkar få ett villkor som aldrig gäller.Majo skrev:For-loopen i Bash ser lite annorlunda ut än i andra språk jag använt den i.
Kod: Markera allt
for i in a b c
do
echo $i
done
Har du lust att förklara exakt vad som händer i denna for-loop? Den fungerar ju klockrent, men jag förstår inte exakt hur. Vore kul att lära sig och inte bara kopiera.Konservburk skrev:Kod: Markera allt
COMPDEST="--compare-dest=../full_backup" for i in $(seq -f%02.f 2 $(date -d-1day +%d)) do COMPDEST="--compare-dest=../$i $COMPDEST" done
Vi börjar med date-kommandot:Majo skrev:Har du lust att förklara exakt vad som händer i denna for-loop? Den fungerar ju klockrent, men jag förstår inte exakt hur. Vore kul att lära sig och inte bara kopiera.Konservburk skrev:Kod: Markera allt
COMPDEST="--compare-dest=../full_backup" for i in $(seq -f%02.f 2 $(date -d-1day +%d)) do COMPDEST="--compare-dest=../$i $COMPDEST" done
Kod: Markera allt
date -d-1day +%d
Kod: Markera allt
date -d yesterday +%d
Kod: Markera allt
seq -f%02.f 2 $(date -d-1day +%d)
Kod: Markera allt
seq -f%02.f 2 07
Kod: Markera allt
seq 2 7
Kod: Markera allt
COMPDEST="--compare-dest=../full_backup"
for i in 02 03 04 05 06 07
do COMPDEST="--compare-dest=../$i $COMPDEST"
done
Kod: Markera allt
COMPDEST="--compare-dest=../full_backup"
COMPDEST="--compare-dest=../02 $COMPDEST"
COMPDEST="--compare-dest=../03 $COMPDEST"
COMPDEST="--compare-dest=../04 $COMPDEST"
COMPDEST="--compare-dest=../05 $COMPDEST"
COMPDEST="--compare-dest=../06 $COMPDEST"
COMPDEST="--compare-dest=../07 $COMPDEST"
Kod: Markera allt
COMPDEST="--compare-dest=../07 --compare-dest=../06 --compare-dest=../05 --compare-dest=../04 --compare-dest=../03 --compare-dest=../02 --compare-dest=../full_backup"
Känner tyvärr inte till vilka böcker som är bra. Själv brukar jag använda Advanced Bash-Scripting Guide om jag är osäker på något: http://tldp.org/LDP/abs/html/Majo skrev:Har du förresten nåt förslag på en bra bok om bashscriptning, där man hittar språk, tips, tekniker? Sajter på nätet i all ära, men inget går upp mot en stadig bok i handen...