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


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

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

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

Поэтому я считаю, что лучшим способом было бы запустить скрипт bash ...


2
2017-08-16 09:17


происхождения




ответы:


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

find /path/Camera1 -ctime +7 -delete 

использование crontab если вы хотите запланировать его; Там есть больше информации здесь,


3
2017-08-16 09:44



Спасибо вам за ваши ответы. Это не соответствует моим потребностям, но оно легкое и сделает трюк на 99%! - Sulliwane
БУДЬТЕ ОСТОРОЖНЫ, ЭТО удалит ваши скрытые файлы - Chintan7027


Я был в очень похожей ситуации. У меня большой раздел 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 / "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

Надеюсь, поможет!


5
2017-10-08 00:43



Разве вы не должны перерасчитывать Directory_Percentage в цикле while? - Luis Lobo Borobia
@ Луис Лобо Боробия, ты прав! Я только что обновил скрипт с исправлением - max


Я начал думать о том, как тяжело было бы хранить только определенное количество файлов. Я повернулся к 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 гигов

Вы можете изменить «rm» на «ls», чтобы он отображал файлы, которые он удалял. Было бы безумно не тщательно проверять сценарий, предложенный неизвестным в сети, который удаляет файлы!

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


3
2017-08-20 00:27





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

Однако я сделал бы еще один шаг, чтобы остановить переполнение корзины.

В моем cron ..

вытирает старые снимки камеры, если более 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) } }'

пустые мусорные корзины

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

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


2
2018-06-28 21:20





Вы можете написать небольшой скрипт bash, который просто имеет найти команда вроде

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

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


1
2017-08-16 09:33