Limita o tamanho de um diretório excluindo arquivos antigos

2

Eu tenho uma câmera IP que salva suas gravações em um diretório específico chamado Camera1 no meu Ubuntu Server 12.04 .

Gostaria de limitar o tamanho dessa pasta a 5 GB , excluindo -os dias uma vez por dia os arquivos mais antigos.

Primeiramente, verifiquei o programa quota , mas ele não parece permitir a criação de novos arquivos e a exclusão dos antigos.

Então, acho que o melhor método seria executar um script bash ...

    
por Sulliwane 16.08.2012 / 11:17

5 respostas

3

O comando find pode ser usado para localizar arquivos e excluí-los. O comando a seguir, por exemplo, excluirá arquivos criados há mais de sete dias:

find /path/Camera1 -ctime +7 -delete 

Use crontab se você quiser agendá-lo; há mais informações aqui .

    
por Bakpappa 16.08.2012 / 11:44
5

Eu estava em uma situação muito semelhante. Eu tenho uma grande partição LVM contendo 2 diretórios:

  • Vídeos (transmissões ao vivo gravadas) podem usar 88% da partição

  • As fotos (fotos enviadas pelas câmeras ao detectar movimento) podem usar 7% da partição (como as imagens são muito mais leves, eu ainda posso manter fotos mais antigas do que vídeos)

Os 5% restantes são uma margem de segurança para que a partição nunca fique cheia. Observe que estou falando em porcentagens em vez de gigabytes fixos porque o tamanho da minha partição LVM muda se eu substituir ou adicionar um disco rígido.

Então aqui está o script (eu adicionei muitos comentários para que seja facilmente compreensível):

#!/bin/bash
#Usage = sh limit-directory-size.sh /media/computer/mypartition 88 120 ("/media/computer/mypartition" = the directory to be limited / "90"=the percentage of the total partition this directory is allowed to use / "120"=the number of files to be deleted every time the script loops (while $Directory_Percentage > $Max_Directory_Percentage)

#Directory to limit
Watched_Directory=
echo "Directory to limit="$Watched_Directory

#Percentage of partition this directory is allowed to use
Max_Directory_Percentage=
echo "Percentage of partition this directory is allowed to use="$Max_Directory_Percentage

#Current size of this directory
Directory_Size=$( du -sk "$Watched_Directory" | cut -f1 )
echo "Current size of this directory="$Directory_Size

#Total space of the partition = Used+Available
Disk_Size=$(( $(df $Watched_Directory | tail -n 1 | awk '{print }')+$(df $Watched_Directory | tail -n 1 | awk '{print }') ))       
echo "Total space of the partition="$Disk_Size

#Curent percentage used by the directory
Directory_Percentage=$(echo "scale=2;100*$Directory_Size/$Disk_Size+0.5" | bc | awk '{printf("%d\n", + 0.5)}')
echo "Curent percentage used by the directory="$Directory_Percentage

#number of files to be deleted every time the script loops (can be set to "1" if you want to be very accurate but the script is slower)
Number_Files_Deleted_Each_Loop=
echo "number of files to be deleted every time the script loops="$Number_Files_Deleted_Each_Loop

#While the current percentage is higher than allowed percentage, we delete the oldest files
while [ $Directory_Percentage -gt $Max_Directory_Percentage ] ; do
    #we delete the files
    find $Watched_Directory -type f -printf "%T@ %p\n" | sort -nr | tail -$Number_Files_Deleted_Each_Loop | cut -d' ' -f 2- | xargs rm
    #we delete the empty directories
    find $Watched_Directory -type d -empty -delete
    #we re-calculate $Directory_Percentage
    Directory_Size=$( du -sk "$Watched_Directory" | cut -f1 )
    Directory_Percentage=$(echo "scale=2;100*$Directory_Size/$Disk_Size+0.5" | bc | awk '{printf("%d\n", + 0.5)}')
done

Então você liga a cada 15 minutos com uma entrada crontab

*/15 * * * * sh /home/computer/limit-directory-size.sh /media/computer/mypartition/videos 88 120

Espero que ajude!

    
por max 08.10.2014 / 02:43
3

Comecei a pensar em como seria difícil manter apenas uma certa quantidade de arquivos. Eu me virei para o awk, que eu não usei por um tempo, e inventei o seguinte forro.

cd /path/to/Camera1 && ls -ltc | awk '{ if (!system("test -f " )) { size += ; if (size > 5*2^30 ) system("rm " ) } }'
  1. alterar para o diretório em questão
  2. listar arquivos, o mais novo primeiro
  3. Execute o awk na saída, verifique se é um arquivo normal, adicione o tamanho do arquivo a ser contado, remova o arquivo se o tamanho cumulativo exceder 5 gigs

Você pode alterar "rm" para "ls" para listar os arquivos que serão removidos. Seria insano não testar cuidadosamente um script, sugerido por um desconhecido na rede, que remove arquivos!

O script provavelmente quebrará e / ou não fará o que você espera se você tiver caracteres engraçados (por exemplo, espaço) nos nomes dos arquivos.

    
por Bakpappa 20.08.2012 / 02:27
2

Excelente solução com awk!

No entanto, eu dou um passo a mais para impedir que sua lixeira transborde.

No meu cron ..

limpa tiros de cam antigas se ultrapassar 500mb (observe a correção de tamanho + = US $ 5)

*/2 * * * * cd /home/me/Desktop/Dropbox/a_security_cam && ls -ltc | awk '{ if (!system("test -f " )) { size += ; if (size > 0.5*2^30 ) system("rm " ) } }'

esvazia o lixo mais antigo primeiro acima de 2 gb

*/10 * * * * autotrash –min-free 2048

Veja o link

    
por user171095 28.06.2013 / 23:20
1

Você pode escrever um pequeno script bash que tenha apenas um comando como

find /Camera1 -atime +7 -exec rm {} \;  

Isso removeria todos os arquivos que não foram acessados em mais de 7 dias da pasta / Camera1.
Obviamente, isso não é exatamente o que você queria, mas espero que ajude.

    
por xyious 16.08.2012 / 11:33