Сценарий оболочки для удаления файлов, когда диск заполнен - PullRequest
10 голосов
/ 06 мая 2011

Я пишу небольшой небольшой скрипт, чтобы каждый день освобождать место на моем linux через CRON, если каталог кеша становится слишком большим. Так как я очень хорошо разбираюсь в bash-скриптинге, мне понадобится небольшая помощь от вас, гуру Linux.

Вот в основном логика (псевдокод)

    if ( Drive Space Left < 5GB )
    {
        change directory to '/home/user/lotsa_cache_files/'

        if ( current working directory = '/home/user/lotsa_cache_files/')
        {
            delete files in /home/user/lotsa_cache_files/
        }
    }

Получение свободного места на диске

Я планирую освободить место на диске от команды '/ dev / sda5'. Если возвращает мне следующее значение для вашей информации:

Filesystem           1K-blocks      Used Available Use% Mounted on<br>
/dev/sda5            225981844 202987200  11330252  95% /

Так что может понадобиться небольшое регулярное выражение, чтобы получить '11330252' из возвращаемого значения

Немного паранойи

Часть 'if (текущий рабочий каталог = / home / user / lotsa_cache_files /)' - это всего лишь защитный механизм от паранойи внутри меня. Я хочу убедиться, что я действительно нахожусь в '/ home / user / lotsa_cache_files /', прежде чем я продолжу выполнение команды удаления, которая потенциально разрушительна, если текущий рабочий каталог по какой-то причине отсутствует.

Удаление файлов

Удаление файлов будет выполнено с помощью приведенной ниже команды вместо обычного rm -f:

find . -name "*" -print | xargs rm

Это связано с неспособностью систем linux 'rm' каталогить, если он содержит слишком много файлов, как я узнал ранее.

Ответы [ 4 ]

13 голосов
/ 06 мая 2011

Просто еще одно предложение (комментарии в коде):

FILESYSTEM=/dev/sda1 # or whatever filesystem to monitor
CAPACITY=95 # delete if FS is over 95% of usage 
CACHEDIR=/home/user/lotsa_cache_files/

# Proceed if filesystem capacity is over than the value of CAPACITY (using df POSIX syntax)
# using [ instead of [[ for better error handling.
if [ $(df -P $FILESYSTEM | awk '{ gsub("%",""); capacity = $5 }; END { print capacity }') -gt $CAPACITY ]
then
    # lets do some secure removal (if $CACHEDIR is empty or is not a directory find will exit
    # with error which is quite safe for missruns.):
    find "$CACHEDIR" --maxdepth 1 --type f -exec rm -f {} \;
    # remove "maxdepth and type" if you want to do a recursive removal of files and dirs
    find "$CACHEDIR" -exec rm -f {} \;
fi 

Вызов скрипта из crontab для выполнения запланированных чисток

7 голосов
/ 06 мая 2011

Я бы сделал это так:

# get the available space left on the device
size=$(df -k /dev/sda5 | tail -1 | awk '{print $4}')

# check if the available space is smaller than 5GB (5000000kB)
if (($size<5000000)); then
  # find all files under /home/user/lotsa_cache_files and delete them
  find /home/user/lotsa_cache_files -name "*" -delete
fi
4 голосов
/ 24 декабря 2015

Вот скрипт, который я использую для удаления старых файлов в каталоге, чтобы освободить место ...

#!/bin/bash
#
#  prune_dir - prune directory by deleting files if we are low on space
#
DIR=$1
CAPACITY_LIMIT=$2

if [ "$DIR" == "" ]
then
    echo "ERROR: directory not specified"
    exit 1
fi

if ! cd $DIR
then
    echo "ERROR: unable to chdir to directory '$DIR'"
    exit 2
fi

if [ "$CAPACITY_LIMIT" == "" ]
then
    CAPACITY_LIMIT=95   # default limit
fi

CAPACITY=$(df -k . | awk '{gsub("%",""); capacity=$5}; END {print capacity}')

if [ $CAPACITY -gt $CAPACITY_LIMIT ]
then
    #
    # Get list of files, oldest first.
    # Delete the oldest files until
    # we are below the limit. Just
    # delete regular files, ignore directories.
    #
    ls -rt | while read FILE
    do
        if [ -f $FILE ]
        then
            if rm -f $FILE
            then
                echo "Deleted $FILE"

                CAPACITY=$(df -k . | awk '{gsub("%",""); capacity=$5}; END {print capacity}')

                if [ $CAPACITY -le $CAPACITY_LIMIT ]
                then
                    # we're below the limit, so stop deleting
                    exit
                fi
            fi
        fi
    done
fi
3 голосов
/ 06 мая 2011

Чтобы обнаружить занятие файловой системы, я использую это:

df -k $FILESYSTEM | tail -1 | awk '{print $5}'

, что дает мне процент занятости файловой системы, таким образом, мне не нужно вычислять это:)

Если вы используете bash, вы можете использовать операцию pushd / popd, чтобы сменить каталог и обязательно быть в нем.

pushd '/home/user/lotsa_cache_files/'
do the stuff
popd
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...