web-dev-qa-db-fra.com

Script pour supprimer les anciens fichiers (tar) dans un répertoire si le nombre dépasse 15?

S'il vous plaît, n'importe qui peut donner la solution pour cela J'essaie de prendre la sauvegarde gitlab sur un autre serveur, le script devrait supprimer les anciens fichiers si le numéro de fichier dans le répertoire dépasse 15?

1
harsha

Diclaimer: J'ai testé les commandes suivantes avec des noms de fichiers contenant des espaces, mais pas avec des noms de fichiers contenant des sauts de ligne. Je soupçonne qu'ils ne joueront pas bien avec les noms de fichiers contenant le caractère de nouvelle ligne et éviteraient de les utiliser si vous suspectez que des noms de fichiers les contenant pourraient être créés.

Cette approche repose sur l'heure du fichier, donc si les fichiers ont un de leurs attributs modifiés, ils sembleront être plus récents que leur heure de création. Vous seul pouvez décider si le recours à ctime est applicable dans votre situation. Si vous préférez utiliser mtime, modifiez -printf "%C+ %p\n" à -printf "%T+ %p\n" dans les commandes find.

La commande suivante peut être lancée dans le répertoire contenant vos fichiers tar. Cela suppose que les noms de fichiers ressemblent tous à something.tar. Si les noms de fichiers ne sont pas de ce format, la commande devra être modifiée, soit en changeant le -iname '*.tar.' à -iname '*.tar.gz*' si les fichiers sont des fichiers .tar.gz, ou en supprimant l'intégralité de -iname '*.tar.' chaîne si vous souhaitez simplement opérer sur n'importe quel fichier de ce répertoire, quel que soit le format du nom de fichier.

find . -mindepth 1 -maxdepth 1 -type f -iname '*.tar' -printf "%C+ %p\n" | sort -n | cut -d ' ' -f 2- | head -n -15 | xargs -I{} echo "{}"

Si cela vous montre les fichiers les plus anciens, en dehors de votre limite de 15 fichiers, utilisez la commande suivante pour supprimer ces fichiers.

find . -mindepth 1 -maxdepth 1 -type f -iname '*.tar' -printf "%C+ %p\n" | sort -n | cut -d ' ' -f 2- | head -n -15 | xargs -I{} rm "{}"

A titre d'explication:

  • find . -mindepth 1 -maxdepth 1 -type f -iname '*.tar' -printf "%C+ %p\n" répertorie tous les fichiers se terminant par .tar dans . (le répertoire courant) sans récursivité dans les sous-répertoires. Il imprime ensuite l'horodatage ctime suivi d'un espace et du nom de fichier avec un caractère de fin de ligne.
  • | sort -n trie la sortie de find numériquement, donc les fichiers sont répertoriés du plus ancien au plus récent (par ctime).
  • | cut -d ' ' -f 2- supprime l'horodatage ajouté que find a créé, mais préserve l'ordre des fichiers répertoriés par sort.
  • | head -n -15 coupe les 15 derniers éléments de la sortie de cut.
  • xargs -I{} rm "{}" exécute la commande rm sur chaque fichier, en s'assurant que le nom de fichier n'est pas divisé sur les espaces.

Cela peut être écrit comme un script bash, avec le nombre de fichiers à conserver et le répertoire sur lequel opérer comme variables dans le script. Il est possible de passer le répertoire et le nombre de rétention de fichiers comme arguments, mais je ne couvrirai pas cela ici.

#!/bin/bash

file_limit=15
dir=/directory/containing/tarfiles

find "$dir" -mindepth 1 -maxdepth 1 -type f -iname '*.tar' -printf "%C+ %p\n" | sort -n | cut -d ' ' -f 2- | head -n -"$file_limit" | xargs -I{} rm "{}"

Si vous enregistrez ce script quelque part, par exemple /home/user/trim_old_gits et assurez-vous que vous lui avez accordé des autorisations exécutables. Le script peut être exécuté à partir de la ligne de commande en entrant:

/home/user/trim_old_gits

Ou de l'intérieur /home/user:

./trim_old_gits

Comme mentionné dans la merveilleuse Jacobréponse python , utiliser l'utilitaire cron serait un bon moyen de s'assurer que cela se produit régulièrement, si c'est il n'est pas crucial que les fichiers soient supprimés immédiatement, ou inotifywait si le timing est plus sensible.

2
Arronical

Étant donné que ctime et mtime ne garantissent pas que vous supprimez réellement le le plus ancien fichiers, selon ce qui est arrivé aux fichiers entre les deux, le script ci-dessous supprime les fichiers, dépassant un nombre arbitraire, à l'intérieur d'un répertoire donné.

(a.o.) ici on peut lire:

ctime est le temps de changement d'inode ou de fichier. Le ctime est mis à jour lorsque les attributs du fichier sont modifiés, comme changer le propriétaire, changer l'autorisation ou déplacer le fichier vers un autre système de fichiers, mais sera également mis à jour lorsque vous modifiez un fichier. mtime

mtime est l'heure de modification du fichier. Le mtime est mis à jour lorsque vous modifiez un fichier. Chaque fois que vous mettez à jour le contenu d'un fichier ou enregistrez un fichier, mtime est mis à jour.

La plupart du temps, ctime et mtime seront les mêmes, sauf si seuls les attributs de fichier sont mis à jour. Dans ce cas, seul le ctime est mis à jour.

Ayant dit cela

Selon le ctime d'un fichier, le petit script d'arrière-plan ci-dessous supprimera les fichiers les plus anciens si le nombre de fichiers dépasse un nombre défini. C'est à vous de décider si c'est une option utilisable dans votre situation.

Le script

#!/usr/bin/env python3
import sys
import os
from operator import itemgetter
import time

dr = sys.argv[1]; n = int(sys.argv[2])

while True:
    time.sleep(3)
    # list files; get the number of files
    files = [os.path.join(dr, f) for f in os.listdir(dr)]; nfiles = len(files)
    if nfiles > n:
        # if nfiles exceeds the threshold, get the number of files to delete
        todel = nfiles - n
        # sort the list by creation date, delete the oldest
        del_list = sorted([
            [f, os.path.getctime(f)] for f in files
            ], key=itemgetter(1))[:todel]
        for f in del_list:
            os.remove(f[0])

Comment utiliser

  1. Copiez le script dans un fichier vide, enregistrez-le sous keep_latest.py
  2. Testez-exécutez le script à partir d'un terminal avec le chemin d'accès à votre répertoire et le nombre de fichiers (les plus récents) à conserver comme arguments:

    python3 '/path/to/keep_latest.py' '/path/to/directory' 15
    

    pour conserver les 15 derniers fichiers dans '/path/to/directory'

  3. Si tout fonctionne bien, ajoutez aux applications de démarrage: Dash> Applications de démarrage> Ajouter. Ajoutez la commande:

    python3 '/path/to/keep_latest.py' '/path/to/directory' 15
    

Autres options

Le script ci-dessus est l'une des nombreuses options. Si soit mtime ou ctime suffirait, une autre option serait d'utiliser inotifywait , et de le faire faire la même chose que script ci-dessus, mais seulement si un fichier est ajouté, déplacé ou copié dans le répertoire.

Si la précision du temps (suppression immédiate des fichiers supplémentaires) n'est pas vraiment importante, une commande exécutée par cron serait également une bonne option.

Si la boucle de inotifywait ou le script ci-dessus était plus efficace, cela ferait l'objet de tests et de comparaisons.

Quoi qu'il en soit, les ressources utilisées seraient pratiquement nulles.

1
Jacob Vlijm