Linux下如何删除14天前的文件和目录并排除指定文件夹?
问题根源
你原来的命令只排除了Folder文件夹里的子内容,但Folder自身如果满足“14天未修改”的条件,会被find命中——因为./Folder这个路径并不匹配./Folder/*,所以加-delete后就会尝试删掉它。
1. 彻底排除Folder的正确命令
方式一:补全路径排除条件
直接在原有命令里加一条排除Folder自身的规则,这样既不碰它的内容,也不碰它本身:
find . -mtime +14 -not -path "./Folder" -not -path "./Folder/*" -delete
方式二:用-prune高效跳过目录
更推荐用-prune,它会直接跳过整个Folder目录的遍历(不用挨个排查里面的文件),效率更高:
find . -name "Folder" -prune -o -mtime +14 -delete
解释:-name "Folder" -prune会找到当前目录下的Folder,直接跳过它;-o是“或”的意思,后面的规则会处理所有不是Folder的、满足14天过期的文件和目录。
2. 关于非空子目录删除的问题
find的-delete参数默认是深度优先遍历的——先删目录里的所有文件和子目录,最后再删空了的父目录。所以只要命令条件对,非空子目录会被自动删干净,不用额外操作。
如果担心兼容性(比如某些系统的find版本),可以显式加上-depth参数(其实-delete已经隐含了这个参数):
find . -depth -name "Folder" -prune -o -mtime +14 -delete
3. Jenkins Groovy里的执行写法
在Groovy脚本里用sh步骤执行即可,直接把bash命令放进去:
sh ''' find . -name "Folder" -prune -o -mtime +14 -delete '''
如果要先预览要删的内容(避免误删),可以先跑不带-delete的版本看输出:
sh ''' find . -name "Folder" -prune -o -mtime +14 -print '''
最优实现
毫无疑问是用-prune的版本,不仅逻辑清晰,还能跳过Folder目录的遍历,比用-not -path省资源,尤其是当Folder里文件很多的时候。
内容的提问来源于stack exchange,提问作者TajniakOsz
相关产品推荐
相关产品推荐

