Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: скрипт при нехватке места на жестк. удалять из конкретной директории..  (Прочитано 4153 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн djdes88

  • Автор темы
  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
уже что то 3-ий день гуглю и всё некак не могу подходящего найти... кроме как find ...
в общем ситуация такова нужен скрипт или ткните в прогу которая может при нехватке места на /dev/sdc1(скажем одном винчестере) авто удалять папки-файлы из конкретной директории(этого винчестера) с самой древней модификации... вроде правильно сказал.

пробывал find /media/mp3/2008-01-07/ -ctime +30 -maxdepth 1 -exec rm -rf {} \;
сами понимаете она ищет только то что старше 30 дней

в общем кто знает помогите пожалйста...

Оффлайн Dfg

  • Активист
  • *
  • Сообщений: 323
    • Просмотр профиля
Тебе готовое или самому написать?
Если самому,
Командой free узнать оставшееся место на конкретном диске.
Потом командой ls отобразить даты файлов в конкретной папке и если больше какого то значения, удалять.
Скрипт кинуть в крон.

Последнюю часть даже могу дать, писал для своего проекта как-то

#!/usr/bin/perl
@result = qx{ls -lT}; #ls на кокретной папке
foreach $elem (@result) {
if ($elem =~ /.+(... .. \d\d:\d\d:\d\d \d\d\d\d) (.+)/) #парсим
{
$path = $1;  #тут время
$path2 = $2; # тут путь
}
$x3 = time-qx{date -j -f "%b %d %T %Y" "$path" "+%s"}; # преобразуем время в utime
if ($x3 > 2592000) # если файлу больше месяца, грохаем.
{
print "$path2 2592000\n";
qx{rm $path2};
}
}

Оффлайн djdes88

  • Автор темы
  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Тебе готовое или самому написать?
Если самому,
Командой free узнать оставшееся место на конкретном диске.
Потом командой ls отобразить даты файлов в конкретной папке и если больше какого то значения, удалять.
Скрипт кинуть в крон.

Последнюю часть даже могу дать, писал для своего проекта как-то

#!/usr/bin/perl
@result = qx{ls -lT}; #ls на кокретной папке
foreach $elem (@result) {
if ($elem =~ /.+(... .. \d\d:\d\d:\d\d \d\d\d\d) (.+)/) #парсим
{
$path = $1;  #тут время
$path2 = $2; # тут путь
}
$x3 = time-qx{date -j -f "%b %d %T %Y" "$path" "+%s"}; # преобразуем время в utime
if ($x3 > 2592000) # если файлу больше месяца, грохаем.
{
print "$path2 2592000\n";
qx{rm $path2};
}
}

привет. пытаюсь сам, но что то руки кривые. назвал файл fsdel.sh вроде отредактировал взял нужное. но не грохает нихрена. в общем если несложно можешь подсказать как связать комманды free и ls. т.е. смотрим место далее смотрим файлы -далее смотрим если места на диски меньше 1gb удаляем из нашей папки самое старое в размере 5gb. я уже извел себя нихренна неполучается. :(

Оффлайн fwhr

  • Старожил
  • *
  • Сообщений: 2104
    • Просмотр профиля
free - это про память.
df - про диски.
Обычно люди получают не то, что заслуживают, а то, что получилось... © Доктор Хауз

Оффлайн Dfg

  • Активист
  • *
  • Сообщений: 323
    • Просмотр профиля
fwhr ога, спутал.

djdes88, вобще это perl скрипт. Так что расширение либо .pl либо вобще без него. И в систему поставить perl


df туда впендюрить можно по аналогии.

@result = qx{df};
foreach $elem (@result) {
if ($elem =~ /dev\/sda1.+ (.\d)\%.+/) #парсим процент заполенния sda1
{
if ($1 > 95) #если заполнено больше 95 процента
{
#то вызываем кусок скрипта выше
}

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

Оффлайн modjo

  • Новичок
  • *
  • Сообщений: 15
  • Ubuntu 9.04
    • Просмотр профиля
Можно немного короче сделать

#!/bin/sh

if [ $(df -h | awk '/sdd1/ {if ($5>"30%") {print 1} else {print 0}}') = "1" ];
    then
        notify-send "Диск /dev/sdd1/ заполнен свыше 30%"
fi

Вместо notify-send вставить свой скрипт.

ps
awk ищет совпадение по sdd1, когда находит сравнивает  5 столбец в совпавшей строчке с заданным параметром (30%), что равняется 1. потом оператор if сравнивает результат работы команды awk и если он равен (1=1), выполняет notify-send. Если результат работы awk не равен (0=1), то ничего не делает.
« Последнее редактирование: 11 Мая 2008, 03:31:14 от modjo »

Оффлайн djdes88

  • Автор темы
  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
root@des:/media/generaly# nano 1111.sh
i#!/bin/sh
if [ $(df -h | awk '/dev/sdc1 {if ($5>"86%") {print 1} else {print 0}}') = "1" ];
then
print fuck
fi

root@des3:/media/generaly# . 1111.sh
bash: [: too many arguments
root@des:/media/generaly# sh 1111.sh
[: 6: 0: unexpected operator
root@des:/media/generaly#  df -k |awk '/dev/sdc1 {if ($5>"86%") {print 1} else {print 0}}'
1
0
0
0
0
0
0
root@des:/media/generaly#

далее пробую другой:
root@des:/media/generaly# nano 1111.pl
#!/usr/bin/perl
@result = qx{df};
foreach $elem (@result) {
if ($elem =~ /dev\/sdc1.+ (.\d)\%.+/)
{
if ($1 > 87)
{
print fuck
}
root@des:/media/generaly# . 111.pl
bash: @result: command not found
bash: 111.pl: line 3: syntax error near unexpected token `('
bash: 111.pl: line 3: `foreach $elem (@result) {'

root@des:/media/generaly# ./111.pl
Missing right curly or square bracket at ./111.pl line 9, at end of line
syntax error at ./111.pl line 9, at EOF
Execution of ./111.pl aborted due to compilation errors.
root@des:/media/generaly#

говорит что пропустил чтото в конце  файла. я неселён в пёрл но что там должно стоять то в пёрле ? done , fi , exit в общем помогите плз,
 :-[
зато
root@webmp3:/media/generaly# df -k /dev/sdc1|grep %|awk '{print $5}'|sed 's/%//g'
Use
89
root@webmp3:/media/generaly#
помогите плз дописать... неделю парюсь над сущим пустяком:( что то в моей ubuntu 8.04 x64 не все скрипт пашут весь инет обрыл в поисках ответа ничего несмог найти

Оффлайн Dfg

  • Активист
  • *
  • Сообщений: 323
    • Просмотр профиля
Вот рабочий вариант для моего раздела sda1

#!/usr/bin/perl
@result = qx{df};
foreach $elem (@result) {
if ($elem =~ /dev\/sda1.+ (.\d)\%.+/)
{
if ($1 > 20)
{
print "fuck";
}
}
}

Оффлайн Dfg

  • Активист
  • *
  • Сообщений: 323
    • Просмотр профиля
А вот кусочек для удаления старых файлов

#!/usr/bin/perl
chdir ("/etc/");
opendir(DIR,"."); #открыть папку
@files = readdir(DIR);
closedir(DIR);
foreach (@files) {
if ((time - ((stat($_))[9])) > 2592000 & -f($_)) {
print("$_\n");
}
}

Итого получится

#!/usr/bin/perl
@result = qx{df};
foreach $elem (@result) {
if ($elem =~ /dev\/sda1.+ (.\d)\%.+/)#поменять sda1
{
if ($1 > 20) #поменять
{
chdir ("/etc/"); # перейти в нужную папку
opendir(DIR,"."); #открыть папку
@files = readdir(DIR);
closedir(DIR);
foreach (@files) {
if ((time - ((stat($_))[9])) > 2592000 & -f($_)) {
print("$_\n"); #сюда команду удаления
}}}}}

Оффлайн djdes88

  • Автор темы
  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
всё так легко оказывается и логично что мне аж стыдно) спасибо тебе огромное побольше бы таких как ты) летом сяду изучать пёрл)

 

Страница сгенерирована за 0.017 секунд. Запросов: 21.