15 votes

Script shell pour supprimer des fichiers lorsque le disque est plein

Je suis en train d'écrire un petit script pour libérer de l'espace sur mon linux tous les jours via CRON si le répertoire cache devient trop gros. Puisque je suis vraiment nul en scriptage bash, j'aurai besoin d'un peu d'aide de la part de vous les gourous linux là-bas.

Voici en gros la logique (pseudo-code)

    if ( Espace disque restant < 5 Go )
    {
        changer de répertoire pour '/home/user/lotsa_cache_files/'

        if ( répertoire de travail actuel = '/home/user/lotsa_cache_files/')
        {
            supprimer les fichiers dans /home/user/lotsa_cache_files/
        }
    }

Obtenir l'espace disque restant

Je prévois d'obtenir l'espace disque restant à partir de la commande '/dev/sda5'. Si elle me renvoie la valeur suivante pour votre information :

Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda5            225981844 202987200  11330252  95% /

Un peu de regex pourrait être nécessaire pour obtenir le '11330252' de la valeur retournée

Un peu de paranoïa

La partie 'if ( répertoire de travail actuel = /home/user/lotsa_cache_files/)' est juste un mécanisme défensif pour la paranoïa en moi. Je veux m'assurer que je suis effectivement dans '/home/user/lotsa_cache_files/' avant de procéder à la commande de suppression qui est potentiellement destructrice si le répertoire de travail actuel n'est pas présent pour une raison quelconque.

Suppression de fichiers

La suppression des fichiers se fera avec la commande ci-dessous au lieu du rm -f habituel :

find . -name "*" -print | xargs rm

Cela est dû à l'incapacité inhérente des systèmes linux de 'rm' un répertoire s'il contient trop de fichiers, comme j'ai pu l'apprendre par le passé.

22voto

hmontoliu Points 1203

Juste une autre proposition (commentaires dans le code):

FILESYSTEM=/dev/sda1 # ou tout système de fichiers à surveiller
CAPACITY=95 # supprimer si le système de fichiers dépasse 95% d'utilisation
CACHEDIR=/home/user/lotsa_cache_files/

# Procéder si la capacité du système de fichiers dépasse la valeur de CAPACITY (en utilisant la syntaxe df POSIX)
# en utilisant [ au lieu de [[ pour une meilleure gestion des erreurs.
if [ $(df -P $FILESYSTEM | awk '{ gsub("%",""); capacity = $5 }; END { print capacity }') -gt $CAPACITY ]
then
    # faisons une suppression sécurisée (si $CACHEDIR est vide ou n'est pas un répertoire, find va sortir
    # avec une erreur ce qui est assez sûr en cas de mauvais fonctionnement.):
    find "$CACHEDIR" --maxdepth 1 --type f -exec rm -f {} \;
    # supprimez "maxdepth and type" si vous souhaitez effectuer une suppression récursive des fichiers et des répertoires
    find "$CACHEDIR" -exec rm -f {} \;
fi 

Appelez le script depuis crontab pour effectuer des nettoyages planifiés

11voto

bmk Points 6832

Je le ferais de cette façon :

# Obtenir l'espace disponible restant sur le périphérique
taille=$(df -k /dev/sda5 | tail -1 | awk '{print $4}')

# Vérifier si l'espace disponible est inférieur à 5 Go (5000000 ko)
if (($taille<5000000)); then
  # Trouver tous les fichiers sous /home/user/lotsa_cache_files et les supprimer
  find /home/user/lotsa_cache_files -name "*" -delete
fi

5voto

lfjeff Points 341

Voici le script que j'utilise pour supprimer les anciens fichiers dans un répertoire afin de libérer de l'espace...

#!/bin/bash
#
#  prune_dir - élaguer le répertoire en supprimant des fichiers si nous manquons d'espace
#
DIR=$1
CAPACITY_LIMIT=$2

if [ "$DIR" == "" ]
then
    echo "ERREUR : répertoire non spécifié"
    exit 1
fi

if ! cd $DIR
then
    echo "ERREUR : impossible de changer de répertoire vers '$DIR'"
    exit 2
fi

if [ "$CAPACITY_LIMIT" == "" ]
then
    CAPACITY_LIMIT=95   # limite par défaut
fi

CAPACITY=$(df -k . | awk '{gsub("%",""); capacité=$5}; FIN {imprimer capacité}')

if [ $CAPACITY -gt $CAPACITY_LIMIT ]
then
    #
    # Obtenir la liste des fichiers, les plus anciens en premier.
    # Supprimer les fichiers les plus anciens jusqu'à ce que nous soyons en dessous de la limite. 
    # Supprimer simplement les fichiers réguliers, ignorer les répertoires.
    #
    ls -rt | while read FILE
    do
        if [ -f $FILE ]
        then
            if rm -f $FILE
            then
                echo "Supprimé $FILE"

                CAPACITY=$(df -k . | awk '{gsub("%",""); capacité=$5}; FIN {imprimer capacité}')

                if [ $CAPACITY -le $CAPACITY_LIMIT ]
                then
                    # nous sommes en dessous de la limite, donc arrêter de supprimer
                    exit
                fi
            fi
        fi
    done
fi

3voto

Cédric Julien Points 24177

Pour détecter l'occupation d'un système de fichiers, j'utilise ceci :

df -k $FILESYSTEM | tail -1 | awk '{print $5}'

ce qui me donne le pourcentage d'occupation du système de fichiers, de cette façon, je n'ai pas besoin de le calculer :)

Si vous utilisez bash, vous pouvez utiliser l'opération pushd/popd pour changer de répertoire et être sûr d'y être.

pushd '/home/user/lotsa_cache_files/'
faire les choses
popd

-2voto

chovy Points 8012

Voici ce que je fais :

while read f; do rm -rf ${f}; done < movies-to-delete.txt

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X