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