czyszczenie miniaturek
Aktualnie wiele programów wyświetla gdzieniegdzie miniaturki pokazujące zawartość plików. Wygenerowanie takiej miniaturki trochę zwykle zabiera więc je się cache'uje. Ponieważ jak wspomniałem robi to wiele programów, więc powstał standard cache'owania żeby nie musiał każdy sobie tego robić oddzielnie (korzyści oczywiste) ― Thumbnail Managing Standard. Spora część programów go używa więc jest godny uwagi. Czasami jednak okazuje się, że w cache'u mamy sporo śmiecia, czasami aż tak dużo że zaczyna to być objętościowo zauważalne na dysku. Trzeba wtedy trochę przeczyścić.
Owe „śmiecie” można podzielić na dwie główne grupy. Pierwsza to miniaturki nieistniejących plików. Zostają gdy plik zostanie usunięty lub zmieni nazwę. Druga to po prostu nieużywane miniaturki, których nie ma sensu trzymać ze względu na nieprzydatność.
Drugi przypadek można szybko rozwiązać na przykład (stąd) tak: $find ~/.thumbnails -type f -atime +7 -delete Po drobnych zmianach i dodaniu logowania wygląda to tak: LIFE=14
LOG=${HOME}/.thumbnails/clean.log
( find "${HOME}/.thumbnails" \
-mindepth 2 -type f -atime +"$LIFE"\
-exec bash -c 'pngmeta "{}" | awk -F :\ -- /Thumb::URI:/{print\$2}' \;\
-delete
) | sed "s/^/[`date -Imin`] UNUSED /" >> "$LOG"
Szybko się jednak okazało, że istnieje jeszcze ten pierwszy i (w moim wypadku) jest nawet istotniejszy. Żeby się tego pozbyć trzeba niestety przejrzeć wszystko. ‘find’ jest fajny, ale skoro tak, to nie ma chyba sensu się nim bawić. Końcowy skrypt: (skrypt) #!/bin/bash Wymaga wget'a, date z GNU i pngmeta. Chodzi powoli. Głównie dzięki sprawdzaniu miniaturek zewnętrznych plików, ale łatwo to wyrzucić, jak ktoś nie chce. Ja osobiście preferuję pozbycie się wszystkiego spoza mojego dysku. Jeszcze wyciąganie URI z pliku, ale tego się nie przeskoczy, bo nawet gdyby pominąć logowanie tego co jest wyrzucane, to trzeba jakoś sprawdzić czy plik bazowy istnieje. Na pewno można ten skrypt zrobić ładniej, ale tak przynajmniej działa. Z resztą, ustawienie go w cronie raz na tydzień gdzieś koło piątej rano powinno wystarczyć żeby nie przeszkadzał.
# CONFIGURATION
LIFE=1209600
LOG=${HOME}/.thumbnails/clean.log;
TIME=`date +%s`
# Get URI of thumbnail
getthuri() { pngmeta "$f" | awk -F ': ' -- '/Thumb::URI:/{print$2}'; }
for f in ${HOME}/.thumbnails/*/*.png; do
ATIME=`stat -c%X "$f"`
if [ `dc -e "$TIME $ATIME -p"` -gt "$LIFE" ]; then
URI=`getthuri`
echo "[`date -Imin`] UNUSED $URI" >> $LOG
rm "$f" >&2 2>/dev/null
else
URI=`getthuri`
# Get local path if it's local, empty string otherwise
LOCAL=`awk -F 'file://' -- '/^file:\/\/\//{print$2}' <<< "$URI"`
# If it's local check if base file still exists
if [ ! -z "$LOCAL" -a ! -e "$LOCAL" ]; then
echo "[`date -Imin`] NONEXISTENT $URI" >> $LOG
rm "$f" >&2 2>/dev/null
elif [ ! -z `egrep '^(http|ftp)s?://' <<< "$URI"` ]; then
# External - check with wget
if wget -q --spider "$URI"; then true; else
echo "[`date -Imin`] NONEXISTENT $URI" >> $LOG
rm "$f" >&2 2>/dev/null
fi
fi
fi
done
Przy okazji, kto mi poleci jakiś dobry i wygodny podświetlacz składni z wyjściem z HTMLu? Bo „wklejalne” wersje tych przykładów powyżej uzyskałem po prostu przez kilka sedów i awka w potoku :P