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

编写Bash脚本递归遍历目录,保留最新2个.X结尾子目录

批量保留最新2个以.X/.x结尾的子目录的Bash脚本

直接用下面的Bash脚本就能实现需求,它会从指定的父目录出发,递归遍历所有子目录,在每个目录里只保留最新的2个以.X或.x结尾的子目录,其余的会被删除:

#!/bin/bash
PARENT_DIR="./parent"  # 替换成你的父目录实际路径

find "$PARENT_DIR" -type d -exec bash -c '
  target_dir="$1"
  # 筛选当前目录下以.X/.x结尾的子目录,按修改时间倒序排序(最新的在前)
  dirs_to_check=$(ls -dt "$target_dir"/*.{X,x} 2>/dev/null)
  # 仅当符合条件的目录数量超过2个时,执行删除操作
  if [ $(echo "$dirs_to_check" | wc -l) -gt 2 ]; then
    echo "$dirs_to_check" | tail -n +3 | xargs rm -rf
  fi
' bash {} \;

脚本细节说明

  • find "$PARENT_DIR" -type d:递归遍历父目录下的所有子目录,确保每个层级的目录都被检查到
  • ls -dt "$target_dir"/*.{X,x}:只列出当前目录下以.X或.x结尾的子目录,-d指定只列目录,-t按修改时间倒序排列(最新的排在最前面),2>/dev/null用来屏蔽没有匹配目录时的错误提示
  • wc -l统计符合条件的目录数量,避免目录数量≤2时执行无意义的操作
  • tail -n +3:跳过前2个最新的目录,只取从第3个开始的旧目录
  • xargs rm -rf:批量删除选中的旧目录,-rf确保目录及其内容被彻底删除

安全测试建议

正式执行删除前,建议先把rm -rf换成echo,预览将要删除的目录,确认无误后再替换回来:

echo "$dirs_to_check" | tail -n +3 | xargs echo "将要删除:"

示例验证

原目录结构:

|-- parent
    |-- dir
        |-- file
        |-- dir
            |-- dir.v1.X
            |-- dir.v2.X
            |-- dir.v3.X
    |-- dir
        |-- file
        |-- dir.v1.x
            |-- file
    |-- dir
        |-- dir.v1.X
        |-- dir.v2.X
        |-- dir.v3.X
        |-- dir.v4.x
        |-- dir.v5.x

执行脚本后,目录结构变为:

|-- parent
    |-- dir
        |-- file
        |-- dir
            |-- dir.v2.X
            |-- dir.v3.X
    |-- dir
        |-- file
        |-- dir.v1.x
            |-- file
    |-- dir
        |-- dir.v4.x
        |-- dir.v5.x

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 03:35:19