6
votes

BASH Script pour limiter une taille de répertoire en supprimant les fichiers accédés au dernier

J'avais déjà utilisé une simple commande trouvée pour supprimer des fichiers de goudron non accessibles dans les derniers x jours (dans cet exemple, 3 jours): xxx

J'ai maintenant besoin d'améliorer ce script par Suppression de l'ordre de la date d'accès et de mes compétences d'écriture Bash sont un peu rouillées. Voici ce que j'en ai besoin pour faire:

  1. Vérifiez la taille d'un répertoire / chemin / de fichiers
  2. Si la taille in 1) est supérieure à la taille X, obtenez une liste des fichiers par date d'accès
  3. Supprimer des fichiers dans l'ordre jusqu'à ce que la taille soit inférieure à X

    L'avantage ici est pour les répertoires de cache et de sauvegarde, je ne supprimerai que ce que je dois le garder dans une limite, alors que la méthode simplifiée pourrait passer la limite de taille si un jour est particulièrement important. Je suppose que je dois utiliser Stat et un bash pour une boucle?


0 commentaires

3 Réponses :


1
votes

Je n'ai pas besoin d'utiliser des boucles, juste une application minutieuse de STAT et AWK. Détails et explication ci-dessous, d'abord le code: xxx

Notez qu'il s'agit d'une ligne de commande logique, mais pour le souci de mentale que j'ai divisé.

Il commence par une commande de recherche basée sur celle ci-dessus, sans les parties qui la limitent aux fichiers de plus de 3 jours. Il pipe que pour s'assurer, pour échapper à tous les espaces des noms de fichiers Rechercher des retours, utilise ensuite Xargs pour exécuter Stat sur tous les résultats. Le -f "% A ::% z ::% n" indique que le format à utiliser, avec l'heure du dernier accès dans le premier champ, la taille du fichier dans la seconde et le nom du fichier dans le fichier. troisième. J'ai utilisé '::' pour séparer les champs car il est plus facile de gérer les espaces dans les noms de fichiers de cette façon. Trier puis les trie sur le premier champ, avec -R pour inverser la commande.

Nous avons maintenant une liste de tous les fichiers que nous sommes intéressés, dans l'ordre du dernier consulté au plus tôt accessible. Ensuite, le script AWK ajoute toutes les tailles car elle passe dans la liste et commence à les sortir lorsqu'il devient plus de $ x_size. Les fichiers qui ne sont pas sorties de cette manière seront ceux qui sont conservés, les autres noms de fichiers se déroulent à nouveau pour échapper à tous les espaces, puis à Xargs, qui les exécute.


1 commentaires

Cette solution n'a pas fonctionné. J'ai amélioré le script et j'ai posté le résultat comme une réponse distincte.



5
votes

Voici une méthode simple, facile à lire et à comprendre, je suis venu avec cela:

DIRSIZE=$(du -s /PATH/TO/FILES | awk '{print $1}')
if [ "$DIRSIZE" -gt "$SOMELIMIT" ]
  then
    for f in `ls -rt --time=atime /PATH/TO/FILES/*.tar`; do
    FILESIZE=`stat -c "%s" $f`
    FILESIZE=$(($FILESIZE/1024))

    DIRSIZE=$(($DIRSIZE - $FILESIZE))
    if [ "$DIRSIZE" -lt "$LIMITSIZE" ]; then
        break
    fi
done
fi


1 commentaires

Je pense que ce script est un bon départ, mais cela ne répond pas à la question. Vous avez demandé comment supprimer les fichiers afin que la taille du répertoire tombe sous le seuil. Votre réponse ici ne semble pas supprimer quoi que ce soit, cela trie simplement les fichiers et les boucles. On dirait que vous manquez un "rm" ici quelque part.



10
votes

J'ai amélioré l'exemple de Brunner314 et corrigé les problèmes.

Voici un script de travail que j'utilise: xxx


2 commentaires

très agréable. Juste un peu d'argument Vérification de la santé mentale manquante (ex: Si "2 $" n'est pas un nombre (manquant, c'est-à-dire vide ou autre chose): le dernier test (["$ maxsize" -Lt 1]) sera ko, donc le " Si "ne fera pas la sortie 1 ... et" quoi que ce soit "puisse arriver. Il devrait y avoir, pour 2 $, une ligne avant de tester son format correct (au moins 1 chiffre, le premier étant non nul): Si (printf "% s \ n" "2" $ 2 "| lc_all = 'c' grep '^ [1-9] [0-9] * $'); alors :; usage de printf" ..... n "; sortie 1; fi . Une autre manière pourrait être: Changer || dans && et -Z devient -N et -LT devient --ge et la sortie "autre"


C'est une belle œuvre d'art! excellent!