A-t-il un rapport sur son temps réel de création / modification? Parce que findje pourrais le faire sans regarder le nom alors ...
Wrikken
ils devraient également avoir un temps de création / modification sur eux
bobsr
4
Qu'entendez-vous par «plus vieux que»? Faites-vous référence à l'heure à laquelle le répertoire a été créé, à l'heure à laquelle son contenu a été modifié pour la dernière fois ou à autre chose? Soyez prudent avec certaines des réponses ci-dessous; ctimeest le temps de changement d'inode. Pour un répertoire, il change lorsque des fichiers sont ajoutés ou supprimés du répertoire.
ajk
Réponses:
391
Cela le fera de manière récursive pour vous:
find /path/to/base/dir/*-type d -ctime +10-exec rm -rf {} \;
Explication:
find: la commande unix pour rechercher des fichiers / répertoires / liens etc.
/path/to/base/dir: le répertoire dans lequel commencer votre recherche.
-type d: ne trouve que 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é, exécutez la commande suivante dans ...
rm -rf {}: force récursivement la suppression du répertoire; la {}pièce est l'endroit où le résultat de la recherche est remplacé par la pièce précédente.
Sinon, utilisez:
find /path/to/base/dir/*-type d -ctime +10| xargs rm -rf
Ce qui est un peu plus efficace, car cela revient à:
rm -rf dir1 dir2 dir3 ...
par opposition à:
rm -rf dir1; rm -rf dir2; rm -rf dir3;...
comme dans la -execméthode.
Avec les versions modernes de find, vous pouvez remplacer le ;par +et il fera l'équivalent de l' xargsappel à votre place, en passant autant de fichiers que nécessaire à chaque appel système exec:
-mtimeétait mieux pour moi car il vérifie les changements de contenu plutôt que les changements d'autorisation, sinon c'était parfait.
quickshift du
7
Je pense que cela supprimera également le répertoire de base lui
Ou Gal
3
@OrGal vous avez tout à fait raison. Pour éviter cela, il suffit d' utiliser: find /path/to/base/dir/*.
zloynemec
11
vous pouvez utiliser -maxdepth 1 pour ignorer le contenu des répertoires
Sam
7
L'approche la plus efficace peut se retourner contre vous si vous avez trop de dossiers à supprimer: stackoverflow.com/questions/11289551/… . Pour la même raison, afin d'éviter la suppression du dossier de base, il est préférable d'utiliser -mindepth 1(plutôt que /path/to/folder/*).
Ohad Schneider
41
Si vous souhaitez supprimer tous les sous-répertoires sous /path/to/base, par exemple
mais vous ne voulez pas supprimer la racine /path/to/base, vous devez ajouter -mindepth 1et d' -maxdepth 1options, qui ont accès uniquement les sous - répertoires/path/to/base
-mindepth 1exclut la racine /path/to/basedes correspondances.
-maxdepth 1sera seulement correspondre immédiatement sous les sous - répertoires /path/to/basetels que /path/to/base/dir1, /path/to/base/dir2et , /path/to/base/dir3mais il ne sera pas la liste des sous - répertoires de ces d'une manière récursive. Ainsi, ces exemples de sous-répertoires ne seront pas répertoriés:
Je pense qu'il y a un hic que les fichiers doivent également être âgés de plus de 10 jours. Je n'ai pas essayé, quelqu'un peut confirmer dans les commentaires.
La solution la plus votée ici est manquante -maxdepth 0, elle appellera donc rm -rfchaque sous-répertoire, après sa suppression. Cela n'a pas de sens, alors je suggère:
find /base/dir/*-maxdepth 0-type d -ctime +10-exec rm -rf {} \;
La -deletesolution ci-dessus n'utilise pas -maxdepth 0car findse plaindre que le répertoire n'est pas vide. Au lieu de cela, cela implique -depthet supprime de bas en haut.
Je peux confirmer les -deletetravaux, mais comme vous l'avez dit, vous ne pouvez l'utiliser que pour supprimer des répertoires vides, un peu comme rmdir.
CTodea
3
J'avais du mal à y parvenir en utilisant les scripts fournis ci-dessus et d'autres scripts, en particulier lorsque les noms de fichiers et de dossiers avaient une nouvelle ligne ou des espaces.
Finalement, je suis tombé sur tmpreaper et cela a plutôt bien fonctionné pour nous jusqu'à présent.
Possède des fonctionnalités telles que test, qui vérifie les répertoires de manière récursive et les répertorie. Possibilité de supprimer des liens symboliques, des fichiers ou des répertoires et également le mode de protection d'un certain modèle lors de la suppression
find
je pourrais le faire sans regarder le nom alors ...ctime
est le temps de changement d'inode. Pour un répertoire, il change lorsque des fichiers sont ajoutés ou supprimés du répertoire.Réponses:
Cela le fera de manière récursive pour vous:
Explication:
find
: la commande unix pour rechercher des fichiers / répertoires / liens etc./path/to/base/dir
: le répertoire dans lequel commencer votre recherche.-type d
: ne trouve que 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é, exécutez la commande suivante dans...
rm -rf {}
: force récursivement la suppression du répertoire; la{}
pièce est l'endroit où le résultat de la recherche est remplacé par la pièce précédente.Sinon, utilisez:
Ce qui est un peu plus efficace, car cela revient à:
par opposition à:
comme dans la
-exec
méthode.Avec les versions modernes de
find
, vous pouvez remplacer le;
par+
et il fera l'équivalent de l'xargs
appel à votre place, en passant autant de fichiers que nécessaire à chaque appel système exec:la source
-mtime
était mieux pour moi car il vérifie les changements de contenu plutôt que les changements d'autorisation, sinon c'était parfait.find /path/to/base/dir/*
.-mindepth 1
(plutôt que/path/to/folder/*
).Si vous souhaitez supprimer tous les sous-répertoires sous
/path/to/base
, par exemplemais vous ne voulez pas supprimer la racine
/path/to/base
, vous devez ajouter-mindepth 1
et d'-maxdepth 1
options, qui ont accès uniquement les sous - répertoires/path/to/base
-mindepth 1
exclut la racine/path/to/base
des correspondances.-maxdepth 1
sera seulement correspondre immédiatement sous les sous - répertoires/path/to/base
tels que/path/to/base/dir1
,/path/to/base/dir2
et ,/path/to/base/dir3
mais il ne sera pas la liste des sous - répertoires de ces d'une manière récursive. Ainsi, ces exemples de sous-répertoires ne seront pas répertoriés:et ainsi de suite.
Donc, pour supprimer tous les sous-répertoires sous
/path/to/base
lesquels datent de plus de 10 jours;la source
find
prend en charge l'-delete
opération, donc:Je pense qu'il y a un hic que les fichiers doivent également être âgés de plus de 10 jours. Je n'ai pas essayé, quelqu'un peut confirmer dans les commentaires.
La solution la plus votée ici est manquante
-maxdepth 0
, elle appellera doncrm -rf
chaque sous-répertoire, après sa suppression. Cela n'a pas de sens, alors je suggère:La
-delete
solution ci-dessus n'utilise pas-maxdepth 0
carfind
se plaindre que le répertoire n'est pas vide. Au lieu de cela, cela implique-depth
et supprime de bas en haut.la source
-delete
travaux, mais comme vous l'avez dit, vous ne pouvez l'utiliser que pour supprimer des répertoires vides, un peu commermdir
.J'avais du mal à y parvenir en utilisant les scripts fournis ci-dessus et d'autres scripts, en particulier lorsque les noms de fichiers et de dossiers avaient une nouvelle ligne ou des espaces.
Finalement, je suis tombé sur tmpreaper et cela a plutôt bien fonctionné pour nous jusqu'à présent.
Lien source d'origine
Possède des fonctionnalités telles que test, qui vérifie les répertoires de manière récursive et les répertorie. Possibilité de supprimer des liens symboliques, des fichiers ou des répertoires et également le mode de protection d'un certain modèle lors de la suppression
la source
OU
Version mise à jour et plus rapide de celui-ci:
la source
xargs --show-limits
.-print0
/-0
ne s'occupe- t-il pas des caractères spéciaux du shell, ou non?xargs
version sera @mpen, mais pas la première ligne.