3
votes

Supprimer tous les fichiers datant de plus de 30 jours, en fonction du nom du fichier comme date

Je suis nouveau dans bash, j'ai une tâche pour supprimer tous les fichiers de plus de 30 jours, je peux comprendre cela en fonction du nom des fichiers Y_M_D.ext 2019_04_30.txt .

Je sais que je peux lister tous les fichiers avec ls dans le dossier contenant les fichiers. Je sais que je peux obtenir la date d'aujourd'hui avec $ date et que je peux le configurer pour qu'il corresponde au format de fichier $ date "+% Y_% m_% d"

Je sais que je peux supprimer des fichiers en utilisant rm.

Comment puis-je lier tout cela dans un script bash qui supprime les fichiers datant de plus de 30 jours à compter d'aujourd'hui?

Dans le code pseudo-python, je suppose que cela ressemblerait à:
for file in folder:
    if file.name to date > 30 day from now:
        delete file


3 commentaires

La première étape consiste à convertir la chaîne "YYYYMMDD.text" en une heure d'époque. Ne vous donnez pas la peine d'essayer de comparer les dates avant d'avoir une heure d'époque.


date --date "2019/04/30" + "% s" et date + "% s" vous donnent l'horodatage pour la date donnée et aujourd'hui, il vous suffit besoin de transformer le nom de fichier, puis de comparer les tampons


Le duplicata stackoverflow.com/questions/49294284/... a plusieurs solutions supplémentaires, bien qu'aucune d'entre elles ne soit votée pour.


3 Réponses :


7
votes

Je ne suis en aucun cas un administrateur système, mais vous pouvez envisager un simple script shell du type:

# Generate the date in the proper format
discriminant=$(date -d "30 days ago" "+%Y_%m_%d")

# Find files based on the filename pattern and test against the date.
find . -type f -maxdepth 1 -name "*_*_*.txt" -printf "%P\n" |
while IFS= read -r FILE; do
    if [ "${discriminant}" ">" "${FILE%.*}" ]; then
        echo "${FILE}";
    fi
done

Notez que cela sera probablement considéré comme une solution "profane" par un professionnel. Peut-être que cela est mieux géré par awk , que je ne suis malheureusement pas habitué à utiliser.


0 commentaires

2
votes

Voici une autre solution pour supprimer les fichiers journaux de plus de 30 jours:

find "$element" -type f -mtime +30 -delete

permet d'inclure plusieurs répertoires où supprimer les fichiers

nb_log=$(find "$element" -type f -mtime +30 -name "*.log*"| wc -l)

nous remplissons la variable var: nous faisons une recherche (dans le répertoire fourni) pour les fichiers qui datent de plus de 30 jours et dont le nom contient au moins .log. Puis compte le nombre de fichiers.

rep_log=("/etc/var/log" "/test/nginx/log")

on vérifie alors s'il y a un résultat autre que 0 (positif), si oui on supprime

#!/bin/sh

# A table that contains the path of directories to clean
rep_log=("/etc/var/log" "/test/nginx/log")
echo "Cleaning logs - $(date)."

#loop for each path provided by rep_log 
for element in "${rep_log[@]}"
do
   #display the directory
    echo "$element";
    nb_log=$(find "$element" -type f -mtime +30 -name "*.log*"| wc -l)
    if [[ $nb_log != 0 ]] 
    then
            find "$element" -type f -mtime +30 -delete 
            echo "Successfull!"
    else
            echo "No log to clean !"
    fi
done


2 commentaires

Désolé, mais StackOverflow est un forum en anglais. Veuillez modifier votre réponse pour la traduire en anglais (une réponse en français est hors sujet ici)


Oui désolé, je n'ai pas informé que je répondais en français.



0
votes

Pour supprimer un fichier datant de plus de X jours, vous pouvez utiliser cette commande et la programmer dans /etc/crontab

find / PATH / TO / LOG / * -mtime +10 | xargs -d '\ n' rm

ou

find / PATH / TO / LOG / * -type f -mtime +10 -exec rm -f {} \


1 commentaires

FYI: Votre réponse concerne la suppression des fichiers en fonction de leur date de modification, alors que la question concerne la suppression des fichiers en fonction de leur nom de fichier interprété comme date.