最も古いファイルとフォルダを削除するシェルスクリプト

最も古いファイルとフォルダを削除するシェルスクリプト

運営するシステムを持っています。 1日に1つのフォルダを作成し、日付ごとに名前を付けます。各フォルダ内にセキュリティカメラのビデオを保存し、時間ごとにファイル名を指定します。あなたは次のようなものを持つでしょう:

あなたは次のようなものを持つでしょう:

フォルダが作成されると、1つずつクラウドにアップロードされます。しかし、私のローカルストレージ容量の制限は16GBです。

このようにして、ストレージが一定の割合に達すると、古いファイルを削除し続けるスクリプト(bash)を作成しました。スクリプトが実行するアクションは次のとおりです。

  • 保存率を確認してください。
    • 保存率が75%の場合:
      • 出力ルートフォルダのフォルダ数を計算します。
        • フォルダが複数ある場合:
          • 最も古いフォルダに移動してファイル数を数えます。
            • ファイルがある場合は、最も古いファイルの10個を削除してください。
            • 空の場合は、出力のルートフォルダに戻り、最も古い、空のフォルダを削除します。
        • フォルダが1つしかない場合:
          • 一意のフォルダに移動して、最も古いファイルを10個削除します。
  • cronジョブは1分ごとにスクリプトを実行しますが、スクリプトはデフォルトの条件が満たされている場合にのみコンテンツを削除します。

これはスクリプト自体です(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抽出したファイルを削除します。

Apple コンピュータの場合:

 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
  • 最新のフォルダを除くすべての空のフォルダが削除されます。

おすすめ記事