求可保留最新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
相关产品推荐
相关产品推荐

