Script Bash pour supprimer les fichiers de plus de x jours avec des sous-répertoires
37
J'essaie de supprimer une tonne de fichiers de plus de x jours.
Maintenant, j'ai un script pour le faire
find /path/to/files* -mtime +10 -exec rm {} \;
Mais cela supprimera également les sous-répertoires. Il y a une tonne de dossiers, mais j'aimerais les conserver et supprimer les fichiers de plus de 10 jours contenus dans ces dossiers.
findaccepte l' typeoption permettant de sélectionner, par exemple, uniquement les fichiers.
find /path/to/files -type f -mtime +10 -delete
Laissez de côté -deletepour montrer ce que cela supprimerait, et une fois que vous aurez vérifié, allez-y et exécutez la commande complète.
Cela ne fonctionnerait que sur des fichiers, pas des répertoires. Utilisez -type dpour l'inverse, seulement la liste des répertoires qui correspondent à vos arguments.
Options additionelles
Vous voudrez peut-être lire man find, car il y a d'autres options dont vous pourriez avoir besoin à l'avenir. Par exemple, -maxdepthvous permettrait de restreindre uniquement les éléments trouvés à une profondeur spécifique, par exemple, -maxdepth 0ne pas renvoyer dans des sous-répertoires.
Quelques remarques
Je me demande comment la commande aurait supprimé un dossier, puisque vous ne pouvez pas supprimer un dossier avec rmseulement. Vous aurez besoin rm -rde ça.
Aussi, /path/to/files*est déroutant. Voulez-vous dire /path/to/files/ou attendez-vous que le caractère générique soit étendu à plusieurs noms de fichiers et de dossiers?
Mettez les {}guillemets simples, c'est- '{}'à- dire pour éviter que le nom de fichier / répertoire substitué soit interprété par le shell, tout comme nous protégeons le point-virgule par une barre oblique inverse.
Eh bien, il y a beaucoup de dossiers dans / chemin / vers / fichiers / en fait, je voudrais exécuter le mtime +10 -exec rm dans chacun de ces dossiers, mais conserver les dossiers eux-mêmes. En gros, je voudrais obtenir fichiers de plus de 10 jours et conserver tous les dossiers. Je suis un newb désolé pour ce newbness :)
JoyIan Yee-Hernandez
Eh bien, voilà :) Il suffit de faire un find /path/to/files* -type f -mtime +10et de voir ce qu’il produirait.
Slhck
Oui, en cas de doute, ne faites pas la -exec, voyez ce qu'il trouve en premier.
Rob
2
@ JoyIanYee-Hernandez Vous pouvez également utiliser l' -deleteargument to find, qui supprime tous les fichiers et dossiers, ce dernier uniquement s'il est vide. Cela implique -depth, c'est-à-dire une recherche en profondeur d'abord.
Comme dans les réponses précédentes (+1 pour les deux), l'astuce consiste à utiliser un -type fprédicat.
Notez qu'au lieu de cela, -exec rm '{}'vous pouvez également utiliser le -deleteprédicat. Mais ne fais pas ça. Avec -exec rm '{}'vous, vous pouvez (et devriez) d’abord -exec echo rm '{}'vérifier que c’est vraiment ce que vous voulez. Après cela, relancez la commande sans le echo.
L'utilisation -deleteest plus rapide (pas de fichier supplémentaire fork()et execve()pour chaque fichier), mais cela est risqué car cela -deletefonctionne aussi comme condition, donc:
# delete ALL files
find . -type f -name '*.tmp' -delete
Si vous avez besoin de travailler avec des tonnes de fichiers plus rapidement findet rmplus rapidement, consultez l' find ... | xargs ... rmidiome UNIX.
J'avais du mal à comprendre cela en utilisant les scripts fournis ci-dessus et d'autres scripts, en particulier lorsque les noms de fichiers et de dossiers contenaient des lignes ou des espaces.
Nous sommes finalement tombés sur tmpreaper et cela a assez bien fonctionné pour nous jusqu’à présent.
A 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 ainsi que le mode de protection pour un certain motif lors de la suppression
Pour accélérer la commande, utilisez '+'plutôt que\;
find /path/to/files* -type f -mtime +10 -exec rm '{}' '+'
Cela ne fonctionnera rmqu'une fois à la fin au lieu de chaque fois qu'un fichier est trouvé.
( rmpeut être exécuté plusieurs fois si vous avez vraiment beaucoup de fichiers à cause de la limitation de la longueur de la ligne de commande, mais cela reste presque aussi rapide que d'utiliser -delete)
find /path/to/files* -type f -mtime +10
et de voir ce qu’il produirait.-exec
, voyez ce qu'il trouve en premier.-delete
argument tofind
, qui supprime tous les fichiers et dossiers, ce dernier uniquement s'il est vide. Cela implique-depth
, c'est-à-dire une recherche en profondeur d'abord.-mindepth 1
pour exclure le répertoire parent.Comme dans les réponses précédentes (+1 pour les deux), l'astuce consiste à utiliser un
-type f
prédicat.Notez qu'au lieu de cela,
-exec rm '{}'
vous pouvez également utiliser le-delete
prédicat. Mais ne fais pas ça. Avec-exec rm '{}'
vous, vous pouvez (et devriez) d’abord-exec echo rm '{}'
vérifier que c’est vraiment ce que vous voulez. Après cela, relancez la commande sans leecho
.L'utilisation
-delete
est plus rapide (pas de fichier supplémentairefork()
etexecve()
pour chaque fichier), mais cela est risqué car cela-delete
fonctionne aussi comme condition, donc:mais si vous échangez SEULEMENT les arguments:
Si vous avez besoin de travailler avec des tonnes de fichiers plus rapidement
find
etrm
plus rapidement, consultez l'find ... | xargs ... rm
idiome UNIX.la source
Vous pouvez facilement le faire avec la commande find
Ce qui limite les résultats au type de fichier
la source
J'avais du mal à comprendre cela en utilisant les scripts fournis ci-dessus et d'autres scripts, en particulier lorsque les noms de fichiers et de dossiers contenaient des lignes ou des espaces.
Nous sommes finalement tombés sur tmpreaper et cela a assez bien fonctionné pour nous jusqu’à présent.
Source originale lien
A 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 ainsi que le mode de protection pour un certain motif lors de la suppression
la source
Pour accélérer la commande, utilisez
'+'
plutôt que\;
Cela ne fonctionnera
rm
qu'une fois à la fin au lieu de chaque fois qu'un fichier est trouvé.(
rm
peut être exécuté plusieurs fois si vous avez vraiment beaucoup de fichiers à cause de la limitation de la longueur de la ligne de commande, mais cela reste presque aussi rapide que d'utiliser-delete
)la source
rm -f
find /path/to/files -type file -mtime -5
Cela supprimera les fichiers modifiés dans les 5 jours.
rm -f
find /path/to/files -type file -mtime +5
Ceci effacera les fichiers qui ont été modifiés avant 5 jours.
Utilisez `avant find et à la fin après 5.
la source