web-dev-qa-db-fra.com

Limiter la taille d'un répertoire en supprimant les anciens fichiers

J'ai une caméra IP qui sauvegarde ses enregistrements dans un répertoire spécifique nommé Camera1 dans mon buntu Server 12.04.

Je voudrais limiter la taille de ce dossier à 5 concerts, en supprimant, une fois par jour, les fichiers les plus anciens.

J'ai d'abord vérifié le programme quota mais il ne semble pas permettre la création de nouveaux fichiers et la suppression des anciens.

Donc, je pense que la meilleure méthode serait d’exécuter un script bash ...

2
Sulliwane

La commande find peut être utilisée pour rechercher et supprimer des fichiers. La commande suivante, par exemple, supprimera les fichiers créés il y a plus de sept jours:

find /path/Camera1 -ctime +7 -delete 

Utilisez crontab si vous voulez le planifier. il y a plus d'informations ici .

3
Bakpappa

J'étais dans une situation très similaire. J'ai une grande partition LVM contenant 2 répertoires:

  • Les vidéos (flux en direct enregistrés) peuvent utiliser 88% de la partition

  • Les images (envoyées par les caméras lors de la détection de mouvements) peuvent utiliser 7% de la partition (les images étant beaucoup plus claires, je peux toujours conserver des images plus anciennes que les vidéos)

Les 5% restants constituent une marge de sécurité afin que la partition ne soit jamais pleine. Remarque Je parle en pourcentages au lieu de gigaoctets fixes car la taille de ma partition LVM change si je remplace ou ajoute un disque dur.

Alors voici le script (j'ai ajouté beaucoup de commentaires pour que ce soit facilement compréhensible):

#!/bin/bash
#Usage = sh limit-directory-size.sh /media/computer/mypartition 88 120 ("/media/computer/mypartition" = the directory to be limited / "88"=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=$1
echo "Directory to limit="$Watched_Directory

#Percentage of partition this directory is allowed to use
Max_Directory_Percentage=$2
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 $3}')+$(df $Watched_Directory | tail -n 1 | awk '{print $4}') ))       
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",$1 + 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=$3
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",$1 + 0.5)}')
done

Ensuite, vous appelez toutes les 15 minutes avec une entrée crontab

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

J'espère que ça aide!

6
max

J'ai commencé à penser à quel point il serait difficile de ne conserver qu'un certain nombre de fichiers. Je me suis tourné vers awk, ce que je n’ai pas utilisé depuis longtemps, et j’ai trouvé le liner suivant.

cd /path/to/Camera1 && ls -ltc | awk '{ if (!system("test -f " $9)) { size += $5; if (size > 5*2^30 ) system("rm " $9) } }'
  1. changer de répertoire en question
  2. liste des fichiers, le plus récent en premier
  3. Exécutez awk sur la sortie, vérifiez qu'il s'agit d'un fichier normal, ajoutez la taille du fichier au compteur, supprimez le fichier si la taille cumulée dépasse 5 concerts.

Vous pouvez remplacer "rm" par "ls" pour qu'il répertorie les fichiers à supprimer. Il serait insensé de ne pas tester avec soin un script, suggéré par un inconnu sur le net, qui supprime les fichiers!

Le script cassera probablement et/ou ne fera pas ce que vous attendez si vous avez des caractères amusants (espace par exemple) dans les noms de fichiers.

3
Bakpappa

Vous pourriez écrire un petit script bash qui a juste une commande find comme

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

Cela supprime tous les fichiers qui n'ont pas été utilisés depuis plus de 7 jours du dossier/Camera1.
Évidemment, ce n'est pas tout à fait ce que vous vouliez, mais j'espère que cela vous aidera.

3
xyious

Excellente solution avec awk!

Je voudrais cependant prendre une mesure supplémentaire pour empêcher votre corbeille de déborder.

Dans mon cron ..

essuie les vieux coups de la caméra si plus de 500 Mo (s'il vous plaît noter le correctif de taille + = 5 $)

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

vide la corbeille la plus ancienne en premier sur 2Go

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

Voir http://www.logfish.net/pr/autotrash/

2
user171095