Die Aufgabe welche vor mit Stand war, alle Dateien die älter als eine Stunde waren mit einem Shell-Script zu packen und alle gepackten Dateien älter als 7 Tage zu löschen.
Die Herrausforderung war die Dateien älter als eine Stunde mit den Linux Befehl find
zu finden. Leider gibt es keine direkte Möglichkeit zu sagen, alle Dateien älter als eine Stunde, sondern das geht nur nach Tagen jedoch wie gesagt leider nicht nach Stunden. Also kam ich dank Google, einigem probieren und mit Hilfe eines Kollegen zu nachfolgender Lösung.
Denn was der Befehl find kann, ist das Datum zu einer Referenzdatei zu vergleichen und alle neueren Dateien finden und zwar so:
/usr/bin/find /home/arties/test/ -newer /home/arties/test.csv -iname *.csv
Der nachfolgende Befehl findet dank der Option -newer alle CSV-Dateien im Verzeichniss /home/arties/test/
welche vom Datum her aktueller als die Datei /home/arties/test.csv
sind.
Da wir aber nicht die neueren Dateien haben wollen, sondern alle Dateien die älter sind, können wir das mit der Negation lösen.
/usr/bin/find /home/arties/test/ ! -newer /home/arties/test.csv -iname *.csv
Der nachfolgende Befehl findet durch die Negation der Option -newer alle CSV-Dateien im Verzeichniss /home/arties/test/
welche vom Datum her älter als die Datei /home/arties/test.csv
sind.
Jetzt wollen wir aber alle Dateien älter als eine Stunde und hierzu bedienen wir uns eines Trickes. Wir legen eine Datei an, die eine Stunde alt ist und zwar wie folgt:
DATUM=`date -d "-1 hours" +%m%d%H%M`
/bin/touch -t ${DATUM} /tmp/$$
In Kombination mit dem obigen Teil sieht das Script sieht dann wie folgt aus:
DATUM=`date -d "-1 hours" +%m%d%H%M`
/bin/touch -t ${DATUM} /tmp/$$
/usr/bin/find /home/arties/test/ ! -newer /tmp/$$ -iname *.csv
So da wir ja jetzt noch die gefundenen Dateien packen wollen und veraltete zip-Dateien löschen, sieht das Shell-Script dann komplett folgendermaßen aus:
#!/bin/bash
KEEP_DAYS=7;
CLEAN_DIR="/home/arties/test/ /home/snoopy/test/"FIND="/usr/bin/find"
FIND_OPTIONS="-maxdepth 1 -mtime +${KEEP_DAYS}"
FIND_OPTIONS_ZIP="-maxdepth 1 ! -newer /tmp/$$"if [ -x ${find} ] ; then
echo "Starting Deleting old files..."
date
echofor DIRS in $CLEAN_DIR
do
echo "Looking for directories...${FIND} ${CLEAN_DIR} -type d"
echo
DIRECTORIES=`${FIND} ${DIRS} -type d`for CHECK_DIR in $DIRECTORIES
do
echo "Looking for old files in {$CHECK_DIR}..."
echo
OLD_FILES=`${FIND} ${CHECK_DIR} ${FIND_OPTIONS}`
if [ -n "${OLD_FILES}" ] ; then
echo "Deleting:"
echo "${OLD_FILES}"
/bin/rm -f ${OLD_FILES}
fiecho "Looking for csv files to pack in {$CHECK_DIR}..."
echo
DATUM=`date -d "-1 hours" +%m%d%H%M`
/bin/touch -t ${DATUM} /tmp/$$ZIP_FILES=`${FIND} ${CHECK_DIR} ${FIND_OPTIONS_ZIP} -iname *.csv`
if [ -n "${ZIP_FILES}" ] ; then
echo "Zipping:"
echo "${ZIP_FILES}"
echo
/bin/gzip -f ${ZIP_FILES}
fi
rm /tmp/$$
done
done
date
echo "All done..."
echo
fiexit 0