가장 오래된 파일과 폴더를 삭제하는 쉘 스크립트

가장 오래된 파일과 폴더를 삭제하는 쉘 스크립트

운영하는 시스템을 갖고 있습니다. 하루에 1개의 폴더를 생성하고 날짜별로 이름을 지정합니다. 각 폴더 내에 보안 카메라의 비디오를 저장하고 시간별로 파일 이름을 지정합니다. 당신은 다음과 같은 것을 가질 것입니다 :

당신은 다음과 같은 것을 가질 것입니다 :

폴더가 생성되면 하나씩 클라우드에 업로드됩니다. 하지만 내 로컬 저장 용량 한도는 16GB입니다.

이런 식으로 스토리지가 일정 비율에 도달하면 오래된 파일을 계속 삭제하는 스크립트(bash)를 만들었습니다. 스크립트가 수행할 작업은 다음과 같습니다.

  • 저장 비율을 확인하세요.
    • 저장 비율이 75%인 경우:
      • 출력 루트 폴더의 폴더 수를 계산합니다.
        • 폴더가 여러 개 있는 경우:
          • 가장 오래된 폴더로 이동하여 파일 수를 계산합니다.
            • 파일이 있으면 가장 오래된 파일 10개를 삭제하세요.
            • 비어 있으면 출력의 루트 폴더로 돌아가서 가장 오래되고 비어 있는 폴더를 삭제합니다.
        • 폴더가 하나만 있는 경우:
          • 고유 폴더로 이동하여 가장 오래된 파일 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
  • 최신 폴더를 제외한 모든 빈 폴더가 삭제됩니다.

관련 정보