You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求可保留最新5个创建文件夹的Shell删除脚本变体

解决方案:保留最新创建的5个文件夹,自动删除其余旧文件夹

没问题,我给你写个完全符合需求的脚本——不管当前有多少个文件夹,都只会保留最新创建的5个,剩下的全部删除。先直接上脚本,再给你拆解细节:

# 保留当前目录下最新创建的5个一级子目录,删除其余旧目录
find ./ -maxdepth 1 -type d ! -name "." -printf "%C@ %p\0" | sort -z -n -r | sed -z '1,5d' | awk -v RS='\0' '{print substr($0, index($0, $2))}' | xargs -0 rm -rf

脚本细节拆解

每个部分都是为了安全处理各种特殊文件名(比如含空格、特殊字符的文件夹),同时精准筛选要删除的目录:

  • find ./ -maxdepth 1 -type d ! -name ".":只找当前目录下的一级子目录,排除当前目录本身(.);如果需要递归处理所有子目录,去掉-maxdepth 1即可
  • -printf "%C@ %p\0":输出每个目录的创建时间戳(数值越大表示越新)、空格、目录路径,最后用\0(null字符)分隔,避免文件名里的空格/特殊字符导致脚本出错
  • sort -z -n -r:按null字符分隔内容,以数值方式排序时间戳,再倒序排列——这样最新创建的目录会排在最前面
  • sed -z '1,5d':跳过前5行(也就是最新的5个目录),剩下的就是需要删除的旧目录
  • awk -v RS='\0' '{print substr($0, index($0, $2))}':把每行开头的时间戳去掉,只保留目录路径
  • xargs -0 rm -rf:把筛选出来的旧目录安全传给rm -rf执行删除

重要测试建议

在正式执行删除前,建议先把最后一段的xargs -0 rm -rf换成xargs -0 echo,这样脚本会输出所有要删除的目录,确认无误后再改回rm -rf,避免误删重要内容!

时间维度调整

如果你的“最新创建”其实是指修改时间(比如文件夹内容更新的时间),而不是创建时间,把find里的%C@换成%T@即可;如果是访问时间,换成%A@。

内容的提问来源于stack exchange,提问作者Redox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:27:04