Egyszerű archiváló bash szkript készítése

2009.05.01. | 5 hozzászólás | Kategória: Linux
Címkék: , , ,

Ebben a leírásban bemutatom, hogyan lehet elkészíteni egy egyszerű archiváló bash szkriptet. Egy általam készített szkripten keresztül mutatom be a lépéseket, melyek csupán egy lehetőséget biztosítanak, a végleges működés mindig rajtunk múlik. Kezdjünk is bele.

Először is nyissuk meg kedvenc szövegszerkesztőnket.
Mielőtt bármit csinálnánk adjuk meg, hogy milyen szkriptet is csinálunk:

#!/bin/bash

Én először könyvtárat váltottam, így egyszerűbben tudok későbbiekben parancsokat kiadni az adott könyvtárra. Tehát:

cd /archivalando/fajlok/eleresi/utja

Én szeretném mindig az előző hónapban létrehozott fájlokat archiválni, ezért le kell ezt is kezelni. Az aktuális hónapot egy egyszerű paranccsal le tudom kérdezni:

date +%m

Állítsuk be az előző hónapot egy változóba:

old_honap=`date --date="1 month ago" +%m`

Ezután egy változóba felveszem az előző év és hónap értékét, hogy tudjak szűrni erre a paraméterre:

ido=`date --date="1 month ago" +%Y-%m`

Majd elmentem egy segéd fájlba az archiválandó fájlok nevét, amit így később egyszerűen ki tudok nyerni:

ls -l ../arcvivalandofajlokkonyvtara | grep -v ^d | grep $ido | awk '{print $8}' > archive_$old_honap/backup.txt

Leellenőrzöm, hogy létezik-e már a könyvtár, amit szeretnék létrehozni. (Itt lehet módosítani aszerint, hogyan kezelje a szkript ha már létezik a könyvtár.)

if [ -e /archivalando/fajlok/eleresi/utja/archive_$old_honap ]; then
        echo "Az archive_$old_honap konyvtar letezik"
else
        mkdir archive_$old_honap
        echo "Az archive_$old_honap konyvtarat letrehoztam"
fi

Majd létrehozunk egy könyvtárat az archív fájljaink számára:

if [ -e /archiv/fajlok/eleresi/utja/backup ]; then
        echo "A backup konyvtar letezik"
else
        mkdir /archiv/fajlok/eleresi/utja/backup
        echo "A backup konyvtarat letrehoztam"
fi

Ezután átmozgathatjuk az elmentendő fájlokat a könyvtárba:

cat archive_$old_honap/backup.txt | while read sor; do
        mv $sor archive_$old_honap
done

Ezután törölhetjük a segéd fájlt, mivel ezt nem szeretnénk elmenteni:

rm archive_$old_honap/backup.txt

Beállítjuk, hogy melyik könyvtár legyen tömörítve és milyen fájlként mentse el, illetve hova a program. Ezt változókban tároljuk:

OUTPUT=./backup/archive_$(date +%Y)-$old_honap.tgz
 
BUDIR="./archive_$old_honap"

Majd elvégezzük az archiválást:

tar -czf $OUTPUT $BUDIR

Utolsó előtti műveletként törölhetjük a létrehozott könyvtárat tartalmával együtt, azonban vigyázzunk vele, esetleges adat vesztést okozhat, ezért nyugodtan ki is lehet kommentezni:

rm -R ./archive_$old_honap

Végül üzenetet küldhetünk magunknak a program sikerességéről, vagy esetleges hibájáról:

if [ $? == 0 ]; then
    #Display confirmation message
    echo "A $OUTPUT fajl letrejott a $BUDIR konyvtarbol."
else
    #Display error message message
    echo "Hiba tortent a $OUTPUT fajl $BUDIR konyvtarbol valo letrehozasa kozben."
fi

Mielőtt használnák a szkriptünket ne felejtsünk el futtatási jogot adni rá:

chmod +x archive_szkript.sh

Íme a program egyben:

#!/bin/bash
 
#######################################################
 
##              Simple archive script...      
 
##  Create by blaselinux: (blaselinux@gmail.com)
 
##              Licence GNU GPL v3 or later.
 
##       http://www.gnu.org/licenses/gpl.html
 
##              http://gnu.hu/gplv3.html
 
#######################################################
 
# Change the directory to the archive files
 
cd /home/blaselinux/Sablonok/archive_teszt
 
# Set the old_month
 
old_honap=`date --date="1 month ago" +%m`
 
# Checking the files
 
ido=`date --date="1 month ago" +%Y-%m`
 
ls -l ../archive_teszt | grep -v ^d | grep $ido | awk '{print $8}' > archive_$old_honap/backup.txt
 
# Checking the directory
 
if [ -e /home/blaselinux/Sablonok/archive_teszt/archive_$old_honap ]; then
        echo "Az archive_$old_honap konyvtar letezik"
else
        mkdir archive_$old_honap
        echo "Az archive_$old_honap konyvtarat letrehoztam"
fi
 
# Make a backup directory if it doesn't exist
 
if [ -e /archiv/fajlok/eleresi/utja/backup ]; then
        echo "A backup konyvtar letezik"
else
        mkdir /archiv/fajlok/eleresi/utja/backup
        echo "A backup konyvtarat letrehoztam"
fi
 
# Moving the files
 
cat archive_$old_honap/backup.txt | while read sor; do
        mv $sor archive_$old_honap
done
 
# Delete the aide file
 
rm archive_$old_honap/backup.txt
 
OUTPUT=./backup/archive_$(date +%Y)-$old_honap.tgz
 
BUDIR="./archive_$old_honap"
 
echo "Az archivalas elkezdese a $BUDIR konyvtarbol a $OUTPUT fajlba"
 
tar -czf $OUTPUT $BUDIR
 
# Delete the ./archive_$old_honap directory with files.
 
# Please be careful!!!
 
rm -R ./archive_$old_honap
 
if [ $? == 0 ]; then
    #Display confirmation message
    echo "A $OUTPUT fajl letrejott a $BUDIR konyvtarbol."
else
    #Display error message message
    echo "Hiba tortent a $OUTPUT fajl $BUDIR konyvtarbol valo letrehozasa kozben."
fi

Készen is volnánk. Remélhetőleg érthető a magyarázat, használjátok egészséggel.

A szkript letölthető innen.

Köszönet iKL-nek a segítségért!

Szólj hozzzá Trackback 3349 olvasás, 2 ma

Kapcsolódó írások

Hozzászólások követése

5 hozzászólás

  1. budacsik

    Hmm, mi is a cél? Lementenni minden fájl ami a múlt hónapban jött létre? Vagy ami 30 napja?

    Én máshogy csinálnám, de hát ez subjektív :)

    Mindenesetre most csak annyit csinálok, hogy rsync-el átnyomom a külső hdd-re úgy, hogy a régi fájlokat törli a külső hdd-ről és csak azt másolja rá, ami még nincs ott. Első után a többi már elég gyors. és 2 sor.

  2. blaselinux

    Szia!

    Valóban a cél, hogy minden hónapban elmentse az előző havi fájlokat. Természetesen lehet máshogy csinálni, nem mondtam, hogy nem, de szerintem indulásnak nem rossz és talán rögzül pár alap bash parancs a fenti szkript használata és értelmezése közben. Ez a valódi cél.
    Tudom, hogy vannak programok is ilyen célra, de így is meg lehet csinálni.

    Szóval 2 tanulság.
    1. bash szkripttel szinte mindent meg lehet csinálni
    2. Linux alatt sok alternatíva létezik egy azon feladatra
    :)

  3. budacsik

    Nem “programokra” gondoltam. Ha azt vesszük a cd is program, és a tar és stb… is.
    Igazából a cél ami a legfurább nekem, nem az eszköz. Persze azt is meg lehetne írni egyszerűbben.
    Tehát azt a szkriptet midnen hónap első napjára kell ütemezni(cron?)?

  4. blaselinux

    Igazából mindegy, hogy melyik napra ütemezed be, mivel a létrehozási hónapot figyeli. Tehát az előző hónapban létrehozott fájlokat archiválja. A napokat nem figyeli, csak a hónapot.
    A célról annyit, hogy saját magamnak akartam írni egy archiváló szkriptet és ez jutott eszembe először. :)

  5. akira

    Köszönöm az írás, nagyon sokat tanultam belőle. Szívesen olvasnék még hasonlókat. Köszönettel:
    akira

Szólj hozzá

Használható HTML tagek: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">

A hozzászólás elküldésével elfogadod az oldal felhasználási feltételeit!

Értesítés beállítása hozzászólás nélkül