LINUX.ORG.RU
ФорумAdmin

удалять старые папки если диск заполне более чем на 95%

 ,


0

1

Помогите написать скрипт который будет удалять старые папки,если диск заполнен более чем 95%.Но могу понять как реализовать.Спасибо. пример папок

root@archive:/home/user# ls /storage/
01-01-2018  03-02-2018	05-12-2017  08-01-2018	10-02-2018  12-12-2017	15-01-2018  17-02-2018	19-12-2017  23-01-2018	26-12-2017  30-01-2018
01-02-2018  03-12-2017	06-01-2018  08-02-2018	10-12-2017  13-01-2018	15-02-2018  17-12-2017	20-01-2018  23-12-2017	27-01-2018  30-12-2017
01-12-2017  04-01-2018	06-02-2018  08-12-2017	11-01-2018  13-02-2018	15-12-2017  18-01-2018	20-12-2017  24-01-2018	27-12-2017  31-01-2018
02-01-2018  04-02-2018	06-12-2017  09-01-2018	11-02-2018  13-12-2017	16-01-2018  18-02-2018	21-01-2018  24-12-2017	28-01-2018  31-12-2017
02-02-2018  04-12-2017	07-01-2018  09-02-2018	11-12-2017  14-01-2018	16-02-2018  18-12-2017	21-12-2017  25-01-2018	28-12-2017
02-12-2017  05-01-2018	07-02-2018  09-12-2017	12-01-2018  14-02-2018	16-12-2017  19-01-2018	22-01-2018  25-12-2017	29-01-2018
03-01-2018  05-02-2018	07-12-2017  10-01-2018	12-02-2018  14-12-2017	17-01-2018  19-02-2018	22-12-2017  26-01-2018	29-12-2017



Последнее исправление: Palamar (всего исправлений: 1)

1.смотришь размер свободного места
2.сортируешь по дате
3.удаляешь последние/первые несколько папок

Samamy ★★★
()
for i in `ls -1` ; do
  n=`echo "$i" | sed 's/\([0-9]\{2\}\)-\([0-9]\{2\}\)\([0-9]\{4\}\)/\1\2\3/'`
  l="${l}${n}\n"
done
rm -rf `printf "$l" | sort | head -n 1 | sed 's/\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\3-\2-\1/'`
redgremlin ★★★★★
()
Последнее исправление: redgremlin (всего исправлений: 1)

Надо было сразу делать YYYYMMDD

anonymous
()

не трогай папку! Папка тебя научит на лыжах кататься и рубанок держать...

anonymous
()

Прежде чем спрашивать, сначала надо дать определение, что есть «старые»? А то и find /storage -mindepth 1 -delete вполне может подойти.

anc ★★★★★
()
Ответ на: комментарий от Deleted

Ultimate fix

for i in `ls -1` ; do
  n=`echo "$i" | sed 's/\([0-9]\{2\}\)-\([0-9]\{2\}\)-\([0-9]\{4\}\)/\3\2\1/'`
  l="${l}${n}\n"
done
rm -rf `printf "$l" | sort | head -n 1 | sed 's/\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\3-\2-\1/'`

redgremlin ★★★★★
()
Ответ на: комментарий от redgremlin

В баше аргументы по умолчанию делятся табами, пробелами и переводами строк. Для ls -1 лучше делать так:

IFS=$'\n'
for i in $(ls -1) ; do
…

И это, можно обойтись без пайпа в sed:

sed 's/\([0-9]\{2\}\)-\([0-9]\{2\}\)-\([0-9]\{4\}\)/\3\2\1/'` <<< "${i}"

spijet ★★★
()
Последнее исправление: spijet (всего исправлений: 1)
Ответ на: комментарий от spijet

Еще проще тоже самое:

tmpwatch -vv 168 /storage
Удалить файлы старше 7 дней в папке storage

Bootmen ☆☆☆
()
Ответ на: комментарий от spijet

Для ls -1 лучше делать так

Эмм, а ничего, что при наличии файлов, отличных от указанного формата, всё и так и так сломается?

redgremlin ★★★★★
()
Ответ на: комментарий от redgremlin

И все равно извращенец. Уже написали насчет парсинга ls. Давайте попытаемся догадаться что будет если помимо попадающих под шаблон будут еще другие директории/файлы?
Существует find с ключиком -regex.

anc ★★★★★
()
Ответ на: комментарий от anc

И все равно извращенец

Я старался. Я изначально ставил себе задачу а) решить задачу, б) сделать это максимально непонятно. Сам я уже некоторое время отказался от баш-скриптинга (Bash: зачем в условии пишут символ перед переменной: [[ «x$A» = «x$B» ]] ? (комментарий)). Правда, для этой задачи я бы и перл не стал использовать, потому что полностью солидарен с анонимусом (удалять старые папки если диск заполне более чем на 95% (комментарий)) — если требуется машинная обработка чегобытонибыло, то изначально всё должно храниться в машинно-читаемом виде, в данном случае в машинно-читаемом формате имени логов.

redgremlin ★★★★★
()
Ответ на: комментарий от redgremlin

Насчет перла не соглашусь. Недавно была задача парсинга кучи текстовых файлов. Перл сильно проиграл sed по скорости.
Это не единственный случай.
Но не спорю, сам перловую кашу пользую. Однако для такой тривиальной задачи как у ТС перл - перебор.
А вообще каждой задаче свое решение.

anc ★★★★★
()
Ответ на: комментарий от anc

Перл сильно проиграл sed по скорости.

По скорости парсинга. А по скорости решения задачи, когда включается время на написание скрипта? Особенно, если задача разовая.

redgremlin ★★★★★
()
Ответ на: комментарий от redgremlin

По скорости парсинга.

Да. Причем очень большая разница.

А по скорости решения задачи, когда включается время на написание скрипта?

Тут согласен. Время отладки что перловой каши, что sed-а тоже надо учитывать. Но, когда отладка на перле занимает больше времени из-за того, что он обрабатывает дольше, это не в его пользу.

Особенно, если задача разовая.

Нет, не разовая, используется постоянно. Но даже если предположить что разовая, разовая-разовой рознь.

anc ★★★★★
()
Ответ на: комментарий от redgremlin

Можно всё сделать почти без bash'а, защитившись от большинства неприятностей, однострочником типа

PERCENT_MAX=95
STORAGE_DIR="/storage"
CONDEMNED_COUNT=1

test $(df --output=pcent $STORAGE_DIR | sed -nr '2 s/^[^0-9]*([0-9]+).*/\1/p') -gt $PERCENT_MAX &&
        find $STORAGE_DIR -maxdepth 1 -type d -name '[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]' -printf '%P\n' |
        sed -r 'h; s/^([0-9]{2})-([0-9]{2})-([0-9]{4})$/\3\2\1/; T; G; s/\n/\t/' | 
        sort -n | 
        sed -r 's/^[0-9]+\t//' | 
        head -n $CONDEMNED_COUNT | 
        xargs -I{} -d'\n' echo rm -rf $STORAGE_DIR/{}

Однако, перед закидыванием этого ада в продашн нужно десять раз подумать или сделать то же на перле или питоне.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.