Ограничьте размер каталога, удалив старые файлы

У меня есть IP-камера, которая сохраняет свои записи в определенном каталоге с именем Camera1 на моем сервере Ubuntu 12.04 .

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

Сначала я проверил программу quota , но, похоже, она не позволяет создавать новые файлы и удалять старые.

Так что я думаю, что лучший способ - запустить скрипт bash ...

2
задан 7 February 2017 в 19:22

5 ответов

Эти find команда может использоваться, чтобы найти файлы и удалить их. Следующая команда, например, удалит файлы, созданные больше чем семь дней назад:

find /path/Camera1 -ctime +7 -delete 

Использование crontab, если Вы хотите запланировать его; существует [еще 113] информация здесь .

3
ответ дан 7 February 2017 в 19:22

Я начал думать о том, как трудно это должно будет только сохранить определенное количество файлов. Я обратился к awk, который я не использовал некоторое время и придумал следующий один лайнер.

cd /path/to/Camera1 && ls -ltc | awk '{ if (!system("test -f " $9)) { size += $5; if (size > 5*2^30 ) system("rm " $9) } }'
  1. изменение в рассматриваемом каталоге
  2. файлы списка, новейшие первый
  3. Выполнение awk на выводе, проверяют, что это - регулярный файл, добавьте размер файла, чтобы противостоять, удалить файл, если кумулятивный размер более чем 5 концертов

можно измениться, "комната" к "ls", чтобы иметь его перечисляют файлы, которые это удалило бы. Это было бы безумно для не осторожного тестирования сценария, предложенного неизвестным в сети, которая удаляет файлы!

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

3
ответ дан 7 February 2017 в 19:22

Отличное решение с awk!

я однако сделал бы дополнительный шаг для остановки переполнения trashcan.

В моем кроне..

очистки старые выстрелы бегунка, если более чем 500 МБ (заметьте фиксацию размера + = 5$)

*/2 * * * * cd /home/me/Desktop/Dropbox/a_security_cam && ls -ltc | awk '{ if (!system("test -f " $9)) { size += $5; if (size > 0.5*2^30 ) system("rm " $9) } }'

мусор порожней тары, который самые старые первые более чем 2 ГБ

*/10 * * * * autotrash –min-free 2048

Видят http://www.logfish.net/pr/autotrash/

2
ответ дан 7 February 2017 в 19:22

Вы могли записать немного сценария удара, который просто имеет , находят команда как

find /Camera1 -atime +7 -exec rm {} \;  

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

3
ответ дан 7 February 2017 в 19:22

Я был в очень похожей ситуации. У меня есть большой раздел LVM, содержащий 2 каталога:

  • Видео (зарегистрированные прямые трансляции) могут использовать 88% раздела

  • Изображения (изображения, отправленные камерами при обнаружении движения), могут использовать 7% раздела (поскольку изображения намного легче, я могу все еще сохранить более старые изображения, чем видео),

Остающиеся 5% являются запасом надежности так, чтобы раздел никогда не становился полным. Обратите внимание, что я говорю в процентах вместо фиксированных гигабайтов, потому что размер моих изменений раздела LVM, если я заменяю или добавляю жесткий диск.

Таким образом, вот сценарий (я добавил много комментариев, таким образом, это легко понятно):

#!/bin/bash
#Usage = sh limit-directory-size.sh /media/computer/mypartition 88 120 ("/media/computer/mypartition" = the directory to be limited / "88"=the percentage of the total partition this directory is allowed to use / "120"=the number of files to be deleted every time the script loops (while $Directory_Percentage > $Max_Directory_Percentage)

#Directory to limit
Watched_Directory=$1
echo "Directory to limit="$Watched_Directory

#Percentage of partition this directory is allowed to use
Max_Directory_Percentage=$2
echo "Percentage of partition this directory is allowed to use="$Max_Directory_Percentage

#Current size of this directory
Directory_Size=$( du -sk "$Watched_Directory" | cut -f1 )
echo "Current size of this directory="$Directory_Size

#Total space of the partition = Used+Available
Disk_Size=$(( $(df $Watched_Directory | tail -n 1 | awk '{print $3}')+$(df $Watched_Directory | tail -n 1 | awk '{print $4}') ))       
echo "Total space of the partition="$Disk_Size

#Curent percentage used by the directory
Directory_Percentage=$(echo "scale=2;100*$Directory_Size/$Disk_Size+0.5" | bc | awk '{printf("%d\n",$1 + 0.5)}')
echo "Curent percentage used by the directory="$Directory_Percentage

#number of files to be deleted every time the script loops (can be set to "1" if you want to be very accurate but the script is slower)
Number_Files_Deleted_Each_Loop=$3
echo "number of files to be deleted every time the script loops="$Number_Files_Deleted_Each_Loop

#While the current percentage is higher than allowed percentage, we delete the oldest files
while [ $Directory_Percentage -gt $Max_Directory_Percentage ] ; do
    #we delete the files
    find $Watched_Directory -type f -printf "%T@ %p\n" | sort -nr | tail -$Number_Files_Deleted_Each_Loop | cut -d' ' -f 2- | xargs rm
    #we delete the empty directories
    find $Watched_Directory -type d -empty -delete
    #we re-calculate $Directory_Percentage
    Directory_Size=$( du -sk "$Watched_Directory" | cut -f1 )
    Directory_Percentage=$(echo "scale=2;100*$Directory_Size/$Disk_Size+0.5" | bc | awk '{printf("%d\n",$1 + 0.5)}')
done

Затем Вы называете его каждые 15 минут с crontab записью

*/15 * * * * sh /home/computer/limit-directory-size.sh /media/computer/mypartition/videos 88 120

Надежда это помогает!

7
ответ дан 2 December 2019 в 01:25

Другие вопросы по тегам:

Похожие вопросы: