Shell: Ordner löschen, deren Dateien älter als ein Tag sind

In einem Startordner befindet sich ein Unterstruktur. Hier sollen diejenigen Ordner gelöscht werden, deren Dateien älter als ein Tag sind (Session abgelaufen).

Dazu wird in jedem Unterordner eine Datei „youngest“ angelegt. Gleichzeitig ändert das System das Datum des Unterordners auf „now()“. Somit liesse sich nicht entscheiden, welche Ordner älter als ein Tag sind. Dazu wird dann der timestamp der „youngest“-Datei auf den Ordner übertragen. Danach wird eine leere Reference-Datei mit dem Timestamp von Gestern (minus 24 Stunden) angelegt. FInd kann jetzt die älteren Ordner ausfindig machen und löschen. Der Ordner „stored_files“ ist ein Symlink  und soll auf keinen Fall gelöscht werden (deshalb der Ausschluss im Find-Befehl).

#!/bin/bash
START_DIR="/var/www/user_gen_docs"
TIME_MARKER="__marker__"
DIFF_SECS="86400"

cd "$START_DIR"

# find alle corp_id dirs
find -H . -maxdepth 1 ! -path . -type d | cut -b 2- | sort > /tmp/mydirs.txt

# loop through the dirs and get the youngest dir, than touch file "youngest"
# after that touch dir itself (normally will have current date instead of youngest sub-dir)
cat "/tmp/mydirs.txt" | while read LINE; do
    CUR_PATH="${START_DIR}${LINE}"
    cd "$CUR_PATH"
    touch --reference="`ls -t1 | head -n1`" youngest
    touch --reference="${CUR_PATH}/youngest" "$CUR_PATH"
done

cd "$START_DIR"

# build reference marker (minus 24hours = 86400 secs) and remove all corp_id dirs with are older
FILESTAMP="`date -r "stored_files" +%s`"
NEWSTAMP="`expr $FILESTAMP - $DIFF_SECS`"
NEWTIME="`date -d@$NEWSTAMP`"
touch -d "$NEWTIME" "$TIME_MARKER"
find -H . -maxdepth 1 ! -path "." ! -path "./stored_files" ! -newer "$TIME_MARKER" -type d -exec rm -rf {}\;
rm "$TIME_MARKER"

Schreibe einen Kommentar