Сценарий оболочки для удаления самых старых файлов и папок

У меня работает система. Он создает 1 папку на каждый день, называя ее по дате. Внутри каждой папки он хранит видео с камер безопасности, называя файлы по времени. У вас будет что-то вроде этого:

У вас будет что-то вроде этого:

Папки загружаются в облако, файл за файлом, по мере его создания. Тем не менее, мой локальный лимит хранения составляет 16 ГБ.

Таким образом, я создал скрипт (в bash), чтобы продолжать удалять старые файлы, когда объем хранилища достигает определенного процента. Вот что должен делать скрипт:

  • Обнаруживает% хранения.
    • Если процент хранения составляет 75%:
      • Подсчитайте количество папок в корневой папке вывода.
        • Если более одной папки:
          • Перейдите в самую старую папку и посчитайте файлы.
            • Если у него есть файлы, удалите 10 самых старых файлов.
            • Если он пуст, вернитесь в корневую папку вывода и удалите самую старую пустую папку.
        • Если только одна папка:
          • Перейдите в единственную папку и удалите 10 самых старых файлов.
  • Задание cron будет запускать сценарий каждую минуту, но сценарий будет удалять материал только при выполнении основного условия.

Это сам скрипт ( 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 
  • Это удалит все пустые папки, кроме последней.