Script Shell pour supprimer des répertoires plus anciens que n jours

J'ai des répertoires nommés comme:

2012-12-12
2012-10-12
2012-08-08

Comment supprimer les répertoires de plus de 10 jours avec un script shell bash?

122
demandé sur codeforester 2012-12-14 01:30:19

5 réponses

Cela le fera récursivement pour vous:

find /path/to/base/dir/* -type d -ctime +10 -exec rm -rf {} \;

Explication:

  • find: la commande unix pour trouver des fichiers / répertoires / liens, etc.
  • /path/to/base/dir: le répertoire dans lequel démarrer votre recherche.
  • -type d: rechercher uniquement les répertoires
  • -ctime +10: ne considérez que ceux dont le temps de modification est supérieur à 10 jours
  • -exec ... \;: pour chaque résultat trouvé, faites la commande suivante dans ...
  • rm -rf {}: forcer récursivement supprimer le répertoire; la partie {} est l'endroit où le résultat de la recherche est substitué à partir de la partie précédente.

Vous pouvez également utiliser:

find /path/to/base/dir/* -type d -ctime +10 | xargs rm -rf

Ce Qui est un peu plus efficace, car cela équivaut à:

rm -rf dir1 dir2 dir3 ...

, par opposition à:

rm -rf dir1; rm -rf dir2; rm -rf dir3; ...

Comme dans la méthode -exec.


, Avec les versions modernes de find, vous pouvez remplacer les ; avec + et il sera l'équivalent de la xargs appeler pour vous, passer autant de fichiers que possible sur chaque appel système exec:

find . -type d -ctime +10 -exec rm -rf {} +
301
répondu sampson-chen 2018-07-18 19:51:56

Si vous souhaitez supprimer tous les sous-répertoires du /path/to/base, par exemple

/path/to/base/dir1
/path/to/base/dir2
/path/to/base/dir3

, Mais vous ne voulez pas supprimer la racine /path/to/base, vous devez ajouter -mindepth 1 et -maxdepth 1 options, qui auront accès uniquement les sous-répertoires sous /path/to/base

-mindepth 1 exclut la racine /path/to/base parmi les correspondances proposées.

-maxdepth 1 est-ce que seulement correspondra aux sous-répertoires immédiatement sous /path/to/base tels que /path/to/base/dir1, /path/to/base/dir2 et /path/to/base/dir3 mais il ne listera pas les sous-répertoires de ceux-ci de manière récursive. De sorte que ces les sous-répertoires d'exemple ne seront pas listés:

/path/to/base/dir1/dir1
/path/to/base/dir2/dir1
/path/to/base/dir3/dir1

Et ainsi de suite.

Donc, pour supprimer tous les sous-répertoires sous {[3] } qui ont plus de 10 jours;

find /path/to/base -mindepth 1 -maxdepth 1 -type d -ctime +10 | xargs rm -rf
30
répondu pmgarvey 2016-07-27 09:00:24

find prend en charge l'opération -delete, donc:

find /base/dir/* -ctime +10 -delete;

Je pense qu'il y a un hic que les fichiers doivent aussi avoir plus de 10 jours. N'ont pas essayé, quelqu'un peut confirmer dans les commentaires.

La solution la plus votée ici est manquante -maxdepth 0 donc elle appellera rm -rf pour chaque sous-répertoire, après l'avoir supprimé. Cela n'a pas de sens, donc je suggère:

find /base/dir/* -maxdepth 0  -type d -ctime +10 -exec rm -rf {} \;

La solution -delete ci-dessus n'utilise pas -maxdepth 0 car find se plaindrait que le répertoire n'est pas vide. Au lieu de cela, il implique -depth et supprime de bas en haut.

11
répondu Ondra Žižka 2018-01-03 18:30:59

J'avais du mal à obtenir ce droit en utilisant les scripts fournis ci-dessus et d'Autres scripts en particulier lorsque les fichiers et les noms de dossiers avaient newline ou des espaces.

Finalement trébuché sur tmpreaper et il a été assez bien travaillé pour nous jusqu'à présent.

tmpreaper -t 5d ~/Downloads


tmpreaper  --protect '*.c' -t 5h ~/my_prg

Source d'Origine lien

A des fonctionnalités comme test, qui vérifie les répertoires récursivement et les répertorie. Possibilité de supprimer des liens symboliques, des fichiers ou des répertoires et aussi le mode de protection pour un certain modèle tout en Supprimer

3
répondu user_v 2014-02-20 11:21:34

Ou

rm -rf `find /path/to/base/dir/* -type d -mtime +10`

Mise à jour, version plus rapide de celui-ci:

find /path/to/base/dir/* -mtime +10 -print0 | xargs -0 rm -f
0
répondu Awesome 2015-10-14 09:02:12