我有一个正在运行的系统。它每天创建 1 个文件夹,并按日期命名。在每个文件夹内,它存储来自安全摄像头的视频,并按时间命名文件。你会有这样的东西:
文件夹创建后会逐个上传到云端。但是我的本地存储限制是 16GB。
这样,我制作了一个脚本(在 bash 中),以在存储达到一定百分比时不断删除旧文件。这是脚本应该做的事情:
- 检测存储百分比。
- 如果存储百分比为 75%:
- 计算输出根文件夹中的文件夹数量。
- 如果有多个文件夹:
- 转到最旧的文件夹并计算文件数。
- 如果有文件,请删除 10 个最旧的文件。
- 如果它是空的,请返回到输出的根文件夹并删除最旧的空文件夹。
- 转到最旧的文件夹并计算文件数。
- 如果只有一个文件夹:
- 转到唯一的文件夹并删除 10 个最旧的文件。
- 如果有多个文件夹:
- 计算输出根文件夹中的文件夹数量。
- 如果存储百分比为 75%:
- cron 作业将每分钟运行该脚本,但该脚本仅在满足主要条件时才会删除内容。
#! /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
- 它将删除除最新文件夹之外的所有空文件夹。