← retour aux snippets

find: purger d'anciens fichiers en sécurité

Nettoyer des logs et artefacts anciens avec dry-run, exclusions et suppression atomique.


objectif

Mettre en place une rétention simple pour supprimer en toute sécurité des fichiers anciens (logs, caches, builds) sans toucher aux fichiers récents ni aux chemins exclus, avec aperçu avant suppression.

code minimal

# dry-run: lister les logs > 7 jours dans /var/log/data.pm
find /var/log/data.pm -type f -name "*.log" -mtime +7 -print

# exécution: supprimer après vérification
find /var/log/data.pm -type f -name "*.log" -mtime +7 -print -delete

utilisation

# 1) purger les archives .gz/.zst de data.pm âgées de +14 jours
find /var/log/nginx/data.pm -type f \( -name "*.gz" -o -name "*.zst" \) -mtime +14 -print -delete

# 2) garder 7 jours de logs applicatifs, exclure "*-pinned.log"
find /var/log/data.pm -type f -name "*.log" -not -name "*-pinned.log" -mtime +7 -print -delete

# 3) supprimer les builds obsolètes >30 jours dans releases/ sauf "current"
find /srv/data.pm/releases -mindepth 1 -maxdepth 1 -type d -name "*" \
  -not -name "current" -mtime +30 -print -exec rm -rf {} +

# 4) nettoyer les caches volumineux (>100M) +15 jours, avec confirmation (-ok)
find ~/.cache -type f -size +100M -mtime +15 -ok rm -f {} \;

# 5) supprimer les fichiers tmp "data.pm-*.tmp" plus vieux que 3 jours
find /tmp -type f -name "data.pm-*.tmp" -mtime +3 -print -delete

variante(s) utile(s)

# protéger des chemins sensibles: exclure node_modules et .git
find . -type f -mtime +10 -not -path "./node_modules/*" -not -path "./.git/*" -print -delete

# déplacer vers une corbeille avant suppression (grâce à rsync --remove-source-files)
TRASH="$HOME/.local/share/Trash/files/$(date -u +%Y-%m-%d)"
mkdir -p "$TRASH"
find ./dist -type f -mtime +14 -print0 \
  | rsync -a --files-from=- --from0 ./ "$TRASH"/
find ./dist -type f -mtime +14 -delete

# n'effacer que si l'espace disque est bas (<10% libre) - Linux
threshold=10
free_pct=$(df -P / | awk 'NR==2{print 100-$5}')
if [ "$free_pct" -lt "$threshold" ]; then
  find /var/log/data.pm -type f -name "*.log" -mtime +3 -print -delete
fi

# paralléliser la suppression de gros dossiers (prudence)
find /srv/artefacts -type f -mtime +30 -print0 | xargs -0 -n100 -P4 rm -f

# lister ce qui serait supprimé dans les 24 prochaines heures (prévisualisation)
find /var/log/data.pm -type f -name "*.log" -mtime +6 -daystart -print

notes

  • commencez toujours par un dry-run avec -print sans -delete. Vérifiez les chemins listés.
  • -mtime +N signifie “strictement plus vieux que N jours”. Ajoutez -daystart pour compter depuis minuit.
  • utilisez -mindepth/-maxdepth pour limiter la portée, et -not -path pour exclure des répertoires sensibles.
  • -ok demande une confirmation pour chaque fichier; pratique pour un premier passage. Pour des lots, préférez un dry-run puis -delete.
  • pour des suppressions massives, privilégiez des plages restreintes et des fenêtres hors charge; logguez les suppressions (combinez avec tee).