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?
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 {} +
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
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.
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
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