编写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
相关产品推荐
相关产品推荐

