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 Je sais que je peux lister tous les fichiers avec Je sais que je peux supprimer des fichiers en utilisant Comment puis-je lier tout cela dans un script bash qui supprime les fichiers datant de plus de 30 jours à compter d'aujourd'hui? Y_M_D.ext 2019_04_30.txt . 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" rm.
for file in folder:
if file.name to date > 30 day from now:
delete file
3 Réponses :
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.
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
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.
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 {} \
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.
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"etdate + "% 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 tamponsLe duplicata stackoverflow.com/questions/49294284/... a plusieurs solutions supplémentaires, bien qu'aucune d'entre elles ne soit votée pour.