3 votes

Bash script pour supprimer les fichiers les plus anciens mais conserver les fichiers les plus récents, y compris les sous-répertoires.

J'essaie de supprimer les anciens fichiers mais je dois conserver les fichiers journaux des trois derniers jours,

ls -tr /home/httpd/htdocs/pathname/pathname/config/ /build/logs/apps/ .log | tail -n +4 | xargs rm --

mais il a été supprimé tous les fichiers de conserver seulement 3 fichiers un dossier, mais je veux rester 3 fichiers chaque dossier séparément.

Quelqu'un peut-il m'aider à résoudre ce problème ?

3voto

harrymc Points 394411

Vous pouvez utiliser cette commande :

ls -t path | sed -e '1,3d' | xargs -d '\n' rm

Ou dans une boucle :

for d in $(find path -type d); do
  ls -t "$d" | sed -e '1,3d' | xargs -d '\n' rm
done

Où :

  • ls -t : liste les fichiers dans l'ordre décroissant du temps de modification, un nom de fichier par ligne.
  • sed -e '1,3d' : supprime les 3 premières lignes
  • xargs -d '\n' rm pour chaque ligne d'entrée (sans la nouvelle ligne de fin), la passe comme argument à rm .
  • -d '\n' ceci est nécessaire pour l'efficacité, pour que xargs considère chaque ligne d'entrée un argument séparé, tout en passant autant d'arguments que possible sur une ligne de commande en une seule fois, afin que rm ne soit pas invoqué pour chacun d'entre eux.

Pour plus de possibilités, voir le post Supprimer tous les fichiers X sauf les plus récents dans bash .

2voto

Lane Ouyang Points 476

Vous pouvez essayer ceci, mettez le contenu suivant dans un fichier Shell Shell et exécutez-le.

#!/bin/bash
dirs=($(find /tmp/test -type d))
for dir in "${dirs[@]}"; do
  cd "$dir"
  ls -pt | grep -v / | tail -n +4 | xargs rm -f
done

remplacer /tmp/test avec le nom de votre répertoire.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X