mwgamera has no life


czyszczenie miniaturek

Wpis na 0. poziomie, wysłany 2007-04-27 01:09:49

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

# 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
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ł.

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


Komentarze do notki czyszczenie miniaturek

Dodaj komentarz:

Komentarze można formatować przy użyciu Markdown.