用于删除最旧文件和文件夹的 Shell 脚本

用于删除最旧文件和文件夹的 Shell 脚本

我有一个正在运行的系统。它每天创建 1 个文件夹,并按日期命名。在每个文件夹内,它存储来自安全摄像头的视频,并按时间命名文件。你会有这样的东西:

你会有这样的东西:

文件夹创建后会逐个上传到云端。但是我的本地存储限制是 16GB。

这样,我制作了一个脚本(在 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...

答案1

我希望我们不需要担心我们是有一个文件夹还是多个文件夹。如果我们删除修改时间的文件。

只需检查存储并删除文件夹中最旧的 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删除提取的文件。

对于苹果电脑:

 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
  • 它将删除除最新文件夹之外的所有空文件夹。

相关内容