Ограничьте размер каталога, удалив старые файлы
У меня есть IP-камера, которая сохраняет свои записи в определенном каталоге с именем Camera1 на моем сервере Ubuntu 12.04.
Я хотел бы ограничить размер этой папки 5 гигабайтами, удаляя, скажем, раз в день, самые старые файлы.
Сначала я проверил программу квотирования, но она не позволяет создавать новые файлы и удалять старые.
Поэтому я думаю, что лучший способ - запустить скрипт bash...
5 ответов
find
Команда может быть использована для поиска файлов и их удаления. Например, следующая команда удалит файлы, созданные более семи дней назад:
find /path/Camera1 -ctime +7 -delete
использование crontab
если вы хотите запланировать это; здесь больше информации
Я был в очень похожей ситуации. У меня есть большой раздел LVM с двумя каталогами:
Видео (записанные прямые трансляции) может использовать 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 / "90"=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
Надеюсь, поможет!
Я начал думать о том, как трудно будет хранить только определенное количество файлов. Я повернулся к awk, которым некоторое время не пользовался, и придумал следующий лайнер.
cd /path/to/Camera1 && ls -ltc | awk '{ if (!system("test -f " $9)) { size += $5; if (size > 5*2^30 ) system("rm " $9) } }'
- перейти в каталог, о котором идет речь
- список файлов, сначала самые новые
- Запустите awk на выходе, убедитесь, что это обычный файл, добавьте размер файла в счетчик, удалите файл, если накопительный размер превышает 5 гигабайт
Вы можете изменить "rm " на "ls ", чтобы он отображал список файлов, которые он удалит. Было бы безумно не тщательно проверять скрипт, предложенный неизвестным в сети, который удаляет файлы!
Сценарий, вероятно, сломается и / или не будет делать то, что вы ожидаете, если у вас есть забавные символы (например, пробел) в именах файлов.
Вы могли бы написать небольшой скрипт bash, который просто имеет команду поиска, такую как
find /Camera1 -atime +7 -exec rm {} \;
Это приведет к удалению всех файлов, к которым не было доступа более 7 дней, из папки /Camera1.
Очевидно, это не совсем то, что вы хотели, но я надеюсь, что это поможет.
Отличное решение с awk!
Однако я бы сделал еще один шаг, чтобы не допустить переполнения мусорной корзины.
В моем хроне..
стирает старые снимки с камеры, если их размер превышает 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/