Script de shell para excluir arquivos e pastas mais antigos

4

Eu tenho um sistema em execução. Cria uma pasta para cada dia, nomeando-a por data. Dentro de cada pasta, armazena vídeos de câmeras de segurança, nomeando os arquivos por tempo. Você teria algo assim:

Aspastassãocarregadasparaanuvem,arquivoporarquivo,àmedidaquesãocriadas.Noentanto,meulimitedearmazenamentolocaléde16GB.

Dessaforma,crieiumscript(nobash)paracontinuarexcluindoarquivosantigosconformeoarmazenamentoatingeumadeterminadaporcentagem.Istoéoqueoscriptdevefazer:

  • Detectaoarmazenamento%.
    • Seaporcentagemdearmazenamentoestiverem75%:
      • Conteonúmerodepastasnapastaraizdasaída.
        • Semaisdeumapasta:
          • Váparaapastamaisantigaeconteosarquivos.
            • Sehouverarquivos,excluaos10arquivosmaisantigos.
            • Seestivervazio,volteparaapastaraizdasaídaeexcluaapastavaziamaisantiga.
        • Seapenasumapasta:
          • Váparaaúnicapastaeexcluaos10arquivosmaisantigos.
  • Ocronjobexecutaráoscriptacadaminuto,masoscriptsóexcluiráascoisasseacondiçãoprincipalforatendida.

Esteéopróprioscript( link ):

#! /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

A coisa é que o script não está (aparentemente) contando o número de arquivos dentro da pasta mais antiga (quando mais de uma pasta é detectada) corretamente.

Em vez de voltar para a pasta raiz e excluir a pasta vazia mais antiga, ela continua excluindo os arquivos da pasta mais recente (aparentemente).

Em outras palavras, quando você tem duas pastas (a mais antiga vazia e a mais nova com vídeos nela), ela deve excluir a pasta mais antiga e vazia, mas eu continuo recebendo:

More than one folder detected.
Entering the oldest folder...
Deleting the oldest files...

Desculpe pelo texto / script longo. Alguma sugestão? Obrigado!

    
por André Luís 04.09.2018 / 20:55

1 resposta

2

Espero que não precisemos nos preocupar se temos uma única pasta ou várias pastas. se removermos os arquivos com o tempo modificado.

Basta verificar o armazenamento e remover os 10 arquivos mais antigos da pasta

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' imprime os arquivos com o último registro de data e hora modificado.
  • sort para obter o arquivo mais antigo no topo.
  • head -n 10 para obter 10 arquivos mais antigos.
  • awk '{print $NF}' para extrair o caminho do arquivo.
  • xargs rm -f remove os arquivos que são extraídos.

Para MAC :

 find $RootFolder -type f -print0 | xargs -0 ls -ltr | head -n 10 | awk '{print $NF}' | xargs rm -f

E uma pasta vazia dificilmente ocuparia espaço de 4Kb. Se você quiser remover todas as pastas vazias, exceto as mais recentes, inclua o código abaixo.

  find $RootFolder -type d -empty -printf '%T+ %p\n' | sort | head -n -1 | xargs rm -rf

Ou

 ls -lt $RootFolder/* | awk -F ":" '/total 0/{print last}{last=$1}' | tail -n +2 | xargs rm -rf
  • Ele removerá todas as pastas vazias, exceto as mais recentes.
por 04.09.2018 / 21:45