LINUX.ORG.RU

OpenWRT скрипт удаления старых файлов видеоархива

 , , , ,


0

1

Приветствую! Есть такой скрипт (из темы: https://www.linux.org.ru/forum/admin/11261088):

#!/bin/sh

#Скрипт удаления старых файлов при переполнении диска
# $1 - доспустимый размер занятого места в процентах, например 90, без знака процентов %    
# $2 - точка монтирования, например /mnt/2000gb 
# $3 - имя каталога для очистки старых файлов, например /mnt/2000gb/photo
# запускать так sh remove-old.sh 85 /mnt/2000gb /mnt/2000gb/photo

if [ "$#" -eq 3 ]
   then

#Определяем переменные из аргуметов переданных скрипту
NOT_MORE_PERCENT=$1
MOUNT_POINT=$2
TARGET_DIRECTORY=$3

#Определяем процент занятого места на диске по точке монтирования этого диска
REAL_PERCENT=$(df -h | grep $MOUNT_POINT | awk '{print $5}' | sed 's/.$//')

#В случае если реальный процент больше или равен заданному значению удаляем лишние файлы
if [ "$REAL_PERCENT" -ge "$NOT_MORE_PERCENT" ]
 then

# Т.к. все файлы начинаются с ГГГГ_ММ_ДД сортируем обратной сортировкой, выбираем последнюю строчку, 
# выбираем имя файла, отрезаем от имени первых 10 знаков.
cd $TARGET_DIRECTORY
MOST_OLD_DATE=$(ls -1ARrl | tail -n1 | awk '{print $9}' | cut -c1-10 )

#Находим все файлы по имени в нашем каталоге и удаляем, удаляются только файлы!!!
find $TARGET_DIRECTORY -type f -name "$MOST_OLD_DATE*" -delete

#Находим все пустые директории в заданной директории и удаляем
find $TARGET_DIRECTORY -type d -empty -delete

  else
#В случае если реальный процент меньше заданного значения ничего не делаем
  echo "Еще есть немножко свободного места"
  exit 0
fi

 else
echo "Количество аргументов должно быть равно 3-м"
echo "Введенное количество аргуметов $#"
exit 1
fi

Проблема в том, что под OpenWRT этот скрипт отрабатывает не полностью из-за неподдерживаемых опций (find)

-empty -delete
. да и к тому же строчка
ls -1ARrl | tail -n1 | awk '{print $9}' | cut -c1-10
не выдаёт результата, так как у того человека, который делал этот скрипт для себя имена файлов отличаются. В моём случае имя файйлов имеет такой вид:
Camera1_01_20170614163652.mp4
Подскажите пожалуйста, как переделать скрипт для работы под OpenWRT?


OpenWRT у меня под рукой нет, поэтому не знаю, что там будет работать, а что нет, но можно попробовать заменить

MOST_OLD_DATE=$(ls -1ARrl | tail -n1 | awk '{print $9}' | cut -c1-10 )

#Находим все файлы по имени в нашем каталоге и удаляем, удаляются только файлы!!!
find $TARGET_DIRECTORY -type f -name "$MOST_OLD_DATE*" -delete

#Находим все пустые директории в заданной директории и удаляем
find $TARGET_DIRECTORY -type d -empty -delete

на

MOST_OLD_DATE=$(ls -1AR | grep -E "Camera[0-9]_[0-9]{2,2}_[0-9]{14,14}.*" | cut -c12-19 | sort -r | tail -n1)
find $TARGET_DIRECTORY -type f -name "Camera?_??_${MOST_OLD_DATE}??????.*" -exec rm {} \;

dirs=$(find -type d)
for i in $dirs
 do
  if test -z $(ls $i)
   then
     rmdir $i
  fi
 done

Свой код не проверял, поэтому перед запуском советую либо потестировать на копии, либо перед командами rm и rmdir вставить echo, внимательно посмотреть вывод, убедиться, что ничего лишнего не удалится и только потом убрать echo.

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

Спасибо большое за подсказку надо будет попробовать. А пока воспользовался коротенькой строчкой:

rm /mnt/storage/ftpcam/camera1/`ls /mnt/storage/ftpcam/camera1 -t | awk 'NR>20'`
она хоть и не по проценту точки монтирования смотрит, а по времени, но временно хватает, что бы не переполнять диск, хоть как то. А то что вы предложили, обязательно попробую позднее... Благодарю.

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

А пока воспользовался коротенькой строчкой

Главное, чтоб работало, а чем короче, тем лучше. Единственно, не могу понять:

rm /mnt/storage/ftpcam/camera1/`ls /mnt/storage/ftpcam/camera1 -t | awk 'NR>20'`

Здесь команде rm подставляется путь /mnt/storage/ftpcam/camera1/, а затем команда ls выводит, сортируя по времени от новых к старым, содержимое этого каталога, а команда awk фильтрует 1-ые 20 элементов, выводя начиная с 21-ого. Если у нас 21 файл с именами 1, 2, ..., 21, где 21 - самый старый файл, то выполнится

rm /mnt/storage/ftpcam/camera1/21

и файл с именем 21 удалится. Если файлов меньше 21, то подставится только имя каталога, и rm без опций -r и -d ничего не удалит. Но если файлов окажется больше 21, например 22, то выполнится:

rm /mnt/storage/ftpcam/camera1/21 22

Т. е. rm удалит /mnt/storage/ftpcam/camera1/21, а затем попытается удалить файл 22 из текущего каталога. И хорошо, если его там не окажется, а если окажется файл с таким же именем, но который удалять не надо?

Либо rm вызывается из каталога /mnt/storage/ftpcam/camera1/. Тогда всё правильно отработает, но указание полного пути избыточно.

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

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

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