У меня работает система. Он создает 1 папку на каждый день, называя ее по дате. Внутри каждой папки он хранит видео с камер безопасности, называя файлы по времени. У вас будет что-то вроде этого:
Папки загружаются в облако, файл за файлом, по мере его создания. Тем не менее, мой локальный лимит хранения составляет 16 ГБ.
Таким образом, я создал скрипт (в bash), чтобы продолжать удалять старые файлы, когда объем хранилища достигает определенного процента. Вот что должен делать скрипт:
Это сам скрипт ( https://github.com/andreluisos/motioneyeos/blob/master/storage_cleaner_script/storage_cleaner_script.sh ):
#! /bin/sh ##### VARIABLES ##### RootFolder="/data/output/Camera1" #Must change to your default output folder. Originally, it's "/data/output/Camera1". cd $RootFolder FileCounter=$(find . -name "*.mkv" -o -name "*.avi" -o -name "*.swf" -o -name "*.flv" -o -name "*.mov" -o -name "*.mp4" | wc -l | xargs) #Must change, if the output format if different than the basic ones available originally on MotionEyeOS. FolderCounter=$(find . -mindepth 1 -maxdepth 1 -type d | wc -l | xargs) CurrentStorage=`df -h | grep -vE "^Filesystem|tmpfs|/tmp|/boot|/home|/dev/root" | awk '{print $5}' | cut -d'%' -f1` StorageThreshold=75 #Define the storage % to trigger the script. ##### FUNCTIONS ##### function multiplefolders () { echo "More than one folder detected." cd `ls -Ft | grep '/$' | tail -1` echo "Entering the oldest folder..." if [ "$FileCounter" -eq 0 ]; then echo "No Files detected." cd $RootFolder echo "Going back to the output's root folder..." rm -rf `ls -Ft | grep '/$' | tail -1` echo "Detecting and removing the oldest empty folder..."; else ls -t | tail -10 | xargs rm echo "Deleting the oldest files..."; fi } function singlefolder () { echo "Only one folder detected." echo "Entering the only folder..." cd `ls -Ft | grep '/$' | head -1` ls -t | tail -10 | xargs rm echo "Deleting the oldest files." } function checkfolders () { if [ "$FolderCounter" -gt 1 ]; then multiplefolders fi if [ "$FolderCounter" -eq 1 ]; then singlefolder fi if [ "$FolderCounter" -eq 0 ]; then echo "No folders detected. Please check if the output folder's path is correct." fi } ##### SCRIPT STARTER ##### if [ $CurrentStorage -ge $StorageThreshold ]; then checkfolders else echo "Storage threshold not yet reached." fi
Дело в том, что скрипт (по-видимому) не считает количество файлов в самой старой папке (когда обнаружено более одной папки) правильно.
Вместо того, чтобы вернуться в корневую папку и удалить самую старую пустую папку, он продолжает удалять файлы из самой новой папки (по-видимому).
Другими словами, когда у вас есть 2 папки (самая старая пустая и самая новая с видео в нем), она должна удалить самую старую и пустую папку, но я продолжаю получать:
More than one folder detected. Entering the oldest folder... Deleting the oldest files...
Я надеюсь, что нам не нужно беспокоиться о том, есть ли у нас одна папка или несколько папок. если мы удалим файлы без изменения времени.
Просто проверьте хранилище и удалите 10 самых старых файлов в папке
if [ $CurrentStorage -ge $StorageThreshold ]; then find $RootFolder -type f -printf '%T+ %p\n' | sort | head -n 10 | awk '{print $NF}' | xargs rm -f else echo "Storage threshold not yet reached." fi
-type f -printf '%T+ %p\n'
распечатать файлы с последней измененной отметкой времени. sort
чтобы получить самый старый файл сверху. head -n 10
чтобы получить 10 самых старых файлов. awk '{print $NF}'
для извлечения пути к файлу. xargs rm -f
удаляет извлеченные файлы. Для MAC :
find $RootFolder -type f -print0 | xargs -0 ls -ltr | head -n 10 | awk '{print $NF}' | xargs rm -f
И пустая папка вряд ли займет место 4Kb. Если вы хотите удалить все пустые папки, кроме последней, включите приведенный ниже код.
find $RootFolder -type d -empty -printf '%T+ %p\n' | sort | head -n -1 | xargs rm -rf
Или же
ls -lt $RootFolder/* | awk -F ":" '/total 0/{print last}{last=$1}' | tail -n +2 | xargs rm -rf