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

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!

5 thoughts on “Egyszerű archiváló bash szkript készítése

  1. 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. 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. 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. 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. Köszönöm az írás, nagyon sokat tanultam belőle. Szívesen olvasnék még hasonlókat. Köszönettel:
    akira

Vélemény, hozzászólás?

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük

Ez az oldal az Akismet szolgáltatást használja a spam csökkentésére. Ismerje meg a hozzászólás adatainak feldolgozását .