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.
Y a-t-il un moyen de faire cela?
type
option de filtrage des résultatsfind
accepte l'option type
pour sélectionner, par exemple, uniquement des fichiers.
find /path/to/files -type f -mtime +10 -delete
Laissez -delete
pour indiquer 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 d
pour l'inverse, en répertoriant uniquement les répertoires correspondant à vos arguments.
Vous voudrez peut-être lire man find
, car vous aurez peut-être besoin de plus d'options à l'avenir. Par exemple, -maxdepth
vous permettrait de limiter les éléments trouvés à une profondeur spécifique, par exemple. -maxdepth 0
ne recurse pas dans les sous-répertoires.
Je me demande comment la commande aurait supprimé un dossier, puisque vous ne pouvez pas supprimer un dossier avec rm
uniquement. Vous aurez besoin de rm -r
pour cela.
En outre, /path/to/files*
est source de confusion. Voulez-vous dire /path/to/files/
ou vous attendez-vous à ce que le caractère générique soit étendu à plusieurs noms de fichiers et de dossiers?
Mettez le {}
entre guillemets, 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 avec une barre oblique inverse.
Comme dans les réponses précédentes (+1 pour les deux), l'astuce consiste à utiliser le prédicat -type f
.
Notez qu'au lieu de -exec rm '{}'
, vous pouvez également utiliser le prédicat -delete
. Mais ne fais pas ça. Avec -exec rm '{}'
, vous pouvez (et devriez) commencer par -exec echo rm '{}'
pour vérifier que c’est vraiment ce que vous voulez. Après cela, relancez la commande sans la echo
.
L'utilisation de -delete
est plus rapide (pas de fork()
et execve()
supplémentaires pour chaque fichier), mais cela présente des risques, car -delete
fonctionne également comme condition. Par conséquent:
# delete *.tmp files
find . -type f -name '*.tmp' -delete
mais si vous échangez SEULEMENT les arguments:
# delete ALL files
find . -type f -name '*.tmp' -delete
Si vous avez besoin que find
et rm
accélèrent le traitement de tonnes de fichiers, consultez l'idiome UNIX find ... | xargs ... rm
.
Vous pouvez facilement le faire avec la commande find
$ find -type f
Ce qui limite les résultats au type de fichier
J'avais du mal à bien comprendre les choses à l'aide des scripts fournis ci-dessus et de certains autres scripts, en particulier lorsque les noms de fichiers et de dossiers contenaient des lignes ou des espaces.
Finalement, nous sommes tombés sur tmpreaper et cela a assez bien fonctionné pour nous jusqu’à présent.
tmpreaper -t 5d ~/Downloads
tmpreaper --protect '*.c' -t 5h ~/my_prg
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 ainsi que le mode de protection d'un certain motif lors de la suppression
Pour accélérer la commande, utilisez '+'
au lieu de \;
find /path/to/files* -type f -mtime +10 -exec rm '{}' '+'
Cela ne lancera rm
qu'une seule 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 en raison de la limitation de la longueur de la ligne de commande, mais cela reste presque aussi rapide que d'utiliser -delete
)
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 modifiés avant 5 jours.
Utilisez `avant find et à la fin après 5.