12
votes

Shell Script pour supprimer des fichiers lorsque le disque est plein

J'écris un petit petit script pour dégager l'espace de mon Linux tous les jours via Cron si le répertoire de cache pousse trop grand. Depuis que je suis vraiment vert chez Bash Scripting, j'aurai besoin d'un peu d'aide de votre gourus Linux.

Voici essentiellement la logique (pseudo-code) xxx < H1> Obtenir de l'espace de conduire laissé

Je prévois d'obtenir l'espace de conduite à partir de la commande '/ dev / sda5'. Si vous renvoie la valeur suivante pour que votre information: xxx

donc une petite regex peut être nécessaire pour obtenir le "11330252" de la valeur renvoyée

Une petite paranoïa

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

Suppression de fichiers

La suppression des fichiers sera effectuée avec la commande ci-dessous au lieu de la RM habituelle: xxx

Ceci est dû à l'incapacité inhérente à Linux systèmes à "RM" un répertoire s'il contient trop de fichiers, comme je l'ai appris dans le passé.


1 commentaires

"Incapacité inhérente des systèmes Linux à" RM "un répertoire s'il contient trop de fichiers" cela implique également "RM -RF"?


5 Réponses :


3
votes

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

pushd '/home/user/lotsa_cache_files/'
do the stuff
popd


0 commentaires

10
votes

Je le ferais de cette façon: xxx


1 commentaires

C'est ce que j'allais recommander: Code dure le répertoire de la commande et n'utilisez pas Xargs car il peut être dangereux.



17
votes

Une autre proposition (commentaires sous Code): xxx

appelez le script de crontab pour effectuer des nettoyages planifiés


1 commentaires

Je suggère d'utiliser le drapeau -Delete au lieu de -exec rm -f {} \; . Envisagez également d'ajouter -XDev comme premier drapeau à rester dans le même système de fichiers.



4
votes

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

#!/bin/bash
#
#  prune_dir - prune directory by deleting files if we are low on space
#
DIR=$1
CAPACITY_LIMIT=$2

if [ "$DIR" == "" ]
then
    echo "ERROR: directory not specified"
    exit 1
fi

if ! cd $DIR
then
    echo "ERROR: unable to chdir to directory '$DIR'"
    exit 2
fi

if [ "$CAPACITY_LIMIT" == "" ]
then
    CAPACITY_LIMIT=95   # default limit
fi

CAPACITY=$(df -k . | awk '{gsub("%",""); capacity=$5}; END {print capacity}')

if [ $CAPACITY -gt $CAPACITY_LIMIT ]
then
    #
    # Get list of files, oldest first.
    # Delete the oldest files until
    # we are below the limit. Just
    # delete regular files, ignore directories.
    #
    ls -rt | while read FILE
    do
        if [ -f $FILE ]
        then
            if rm -f $FILE
            then
                echo "Deleted $FILE"

                CAPACITY=$(df -k . | awk '{gsub("%",""); capacity=$5}; END {print capacity}')

                if [ $CAPACITY -le $CAPACITY_LIMIT ]
                then
                    # we're below the limit, so stop deleting
                    exit
                fi
            fi
        fi
    done
fi


2 commentaires

S'il vous plaît vérifier à nouveau le code! Il semble que cela supprimerait des fichiers dans le dossier actuel.


@Max il fait cd $ dir donc ce ne sera pas.



-2
votes

Voici ce que je fais:

en lecture f; faire rm -rf $ {f}; fait


0 commentaires