2012-07-23 10 views
5

Wcześniej używane prostego polecenia find usunąć smołę nie pliki dostępne w ostatnich X dni (w tym przykładzie, 3 dni):Bash skrypt, aby ograniczyć wielkość katalogów usuwając pliki obejrzano ostatni

find /PATH/TO/FILES -type f -name "*.tar" -atime +3 -exec rm {} \; 

Teraz muszę poprawić ten skrypt, usuwając w kolejności datę dostępu, a moje umiejętności pisania basha są nieco zardzewiałe. Oto, co potrzebne do zrobienia:

  1. sprawdzić rozmiar katalogu/ścieżka/do/plików
  2. jeżeli rozmiar w 1) jest większa niż wielkość X uzyskać listę plików według daty dostępu
  3. usuwać pliki w porządku, dopóki rozmiar jest mniejszy niż X

tu korzyścią jest dla pamięci podręcznej i rezerwowych katalogów, tylko usunie to, co trzeba, aby utrzymać go w terminie, natomiast metoda uproszczona może przejść ograniczenie rozmiaru, jeśli jeden dzień jest szczególnie duży. Zgaduję, że muszę użyć stat i bash dla pętli?

Odpowiedz

4

Oto prosty, łatwy do odczytania i zrozumienia sposób wpadłem na to:

DIRSIZE=$(du -s /PATH/TO/FILES | awk '{print $1}') 
if [ "$DIRSIZE" -gt "$SOMELIMIT" ] 
    then 
    for f in `ls -rt --time=atime /PATH/TO/FILES/*.tar`; do 
    FILESIZE=`stat -c "%s" $f` 
    FILESIZE=$(($FILESIZE/1024)) 

    DIRSIZE=$(($DIRSIZE - $FILESIZE)) 
    if [ "$DIRSIZE" -lt "$LIMITSIZE" ]; then 
     break 
    fi 
done 
fi 
+1

Myślę, że ten skrypt jest dobrym początkiem, ale tak naprawdę nie odpowiada na pytanie. Pytałeś, jak usunąć pliki w kolejności, aby rozmiar katalogu spadł poniżej progu. Twoja odpowiedź tutaj wydaje się nie usuwać niczego, tylko sortuje pliki i pętle przez nie. Wygląda na to, że gdzieś tu brakuje "rm". –

1

Nie potrzebowałem używać pętli, wystarczy ostrożna aplikacja stat i awk. Szczegóły i wyjaśnienie poniżej, pierwszy kodeksu:

find /PATH/TO/FILES -name '*.tar' -type f \ 
| sed 's/ /\\ /g' \ 
| xargs stat -f "%a::%z::%N" \ 
| sort -r \ 
| awk ' 
    BEGIN{curSize=0; FS="::"} 
    {curSize += $2} 
    curSize > $X_SIZE{print $3} 
    ' 
| sed 's/ /\\ /g' \ 
| xargs rm 

Należy pamiętać, że jest to jedna z linii poleceń logiczne, ale w trosce o zdrowie psychiczne podzielić go.

Rozpoczyna się od polecenia znajdowania opartego na powyższym, bez części, które ograniczają go do plików starszych niż 3 dni. Pętla to do sed, aby uciec od wszelkich spacji w nazwach plików znajduje zwroty, a następnie używa xargs do uruchamiania statystyk dla wszystkich wyników. -f "% a ::% z ::% N" mówi o formacie, którego należy użyć, z czasem ostatniego dostępu w pierwszym polu, rozmiarze pliku w drugim i nazwą pliku w trzeci. Użyłem "::", aby oddzielić pola, ponieważ w ten sposób łatwiej jest zajmować się spacjami w nazwach plików. Sortuj, a następnie sortuj je na pierwszym polu, z -r, aby odwrócić kolejność.

Teraz mamy listę wszystkich plików, które nas interesują, w kolejności od najnowszego dostępnego do najwcześniejszego dostępu. Następnie skrypt awk dodaje wszystkie rozmiary, gdy przechodzi przez listę, i zaczyna je wyświetlać, gdy przekroczy $ X_SIZE. Pliki, które nie są wyprowadzane w ten sposób, będą przechowywane, pozostałe nazwy plików trafią ponownie do sed, aby uciec z dowolnych spacji, a następnie do xargs, który je uruchamia.

+0

To rozwiązanie nie działa. Poprawiłem skrypt i opublikowałem wynik jako osobną odpowiedź. –

+0

Pomysł był świetny. Dzięki. –

6

poprawiłem przykład brunner314 i stałe problemy w nim.

Oto skrypt pracy używam:

#!/bin/bash 
DELETEDIR="$1" 
MAXSIZE="$2" 
if [[ -z "$DELETEDIR" || -z "$MAXSIZE" || "$MAXSIZE" -lt 1 ]]; then 
    echo "usage: $0 [directory] [maxsize in megabytes]" >&2 
    exit 1 
fi 
find "$DELETEDIR" -type f -printf "%[email protected]::%p::%s\n" \ 
| sort -rn \ 
| awk -v maxbytes="$((1024 * 1024 * $MAXSIZE))" -F "::" ' 
    BEGIN { curSize=0; } 
    { 
    curSize += $3; 
    if (curSize > maxbytes) { print $2; } 
    } 
    ' \ 
    | tac | awk '{printf "%s\0",$0}' | xargs -0 -r rm 
# delete empty directories 
find "$DELETEDIR" -mindepth 1 -depth -type d -empty -exec rmdir "{}" \; 
Powiązane problemy