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

如何保留最近修改的最后2个目录及对应符号链接(避免误删)

保留最新目录、符号链接及其指向目录的解决方案

看起来你已经接近目标了,只是之前的命令没考虑到要保护符号链接指向的目录,导致误删了release4,留下了失效的链接。咱们来调整一下逻辑,确保既保留最新的目录,又不会弄丢符号链接和它指向的目标。

问题根源分析

你之前用ls -t1 | tail -n +3 | grep -v Current筛选要删除的目录时,release4因为修改时间较早,被包含在了删除列表里,但它是Current指向的目录,必须保留。所以核心是要把符号链接本身和它指向的目标目录都加入到“保护名单”里,再结合保留最新2个目录的需求。

改进后的Shell脚本

这个脚本会遍历每个app目录,自动识别需要保留的内容,安全删除其余目录:

#!/bin/bash

# 定义要处理的应用目录数组
apps=("app1" "app2" "app3" "app4" "app5")
base_dir=~/test_dir

for app in "${apps[@]}"; do
    echo "正在处理目录: $app"
    # 切换到目标目录,失败则跳过
    cd "$base_dir/$app" || { echo "无法进入目录 $base_dir/$app,跳过本次处理"; echo ""; continue; }

    # 检查符号链接Current是否存在
    if [ ! -L Current ]; then
        echo "警告:目录 $app 中未找到符号链接Current,跳过"
        echo ""
        continue
    fi

    # 获取Current指向的目标目录
    target_dir=$(readlink Current)
    # 验证目标目录是否存在
    if [ ! -d "$target_dir" ]; then
        echo "警告:Current指向的目录 $target_dir 不存在,跳过"
        echo ""
        continue
    fi

    # 获取所有非符号链接的目录,按修改时间从新到旧排序,取前2个(最新的2个)
    # ls -dt */ 仅列出目录,按修改时间降序排列;sed去掉目录名末尾的斜杠
    latest_dirs=$(ls -dt */ 2>/dev/null | head -n 2 | sed 's/\/$//')

    # 构建需要保留的目录列表:目标目录 + 最新2个目录
    keep_list=("$target_dir")
    # 将latest_dirs拆分为数组,避免目录名含空格的问题
    read -ra latest_arr <<< "$latest_dirs"
    keep_list+=("${latest_arr[@]}")

    # 去重(如果目标目录刚好是最新2个之一,避免重复)
    keep_list=($(printf "%s\n" "${keep_list[@]}" | sort -u))

    # 筛选需要删除的目录:非符号链接目录,且不在保留列表中
    delete_list=()
    for dir in */; do
        dir_name=${dir%/}
        # 跳过符号链接(ls -dt */默认不会列出,但保险起见)
        if [ -L "$dir_name" ]; then
            continue
        fi
        # 检查当前目录是否在保留列表内
        if ! printf "%s\n" "${keep_list[@]}" | grep -q "^$dir_name$"; then
            delete_list+=("$dir_name")
        fi
    done

    # 执行删除操作
    if [ ${#delete_list[@]} -eq 0 ]; then
        echo "没有需要删除的目录"
    else
        echo "即将删除以下目录:${delete_list[*]}"
        rm -r "${delete_list[@]}"
        echo "成功删除 ${#delete_list[@]} 个目录"
    fi

    echo ""
done

脚本关键逻辑说明

  1. 符号链接校验:先检查Current是否存在,再获取它指向的目录并验证有效性,避免处理无效链接。
  2. 最新目录筛选:用ls -dt */只列出真实目录(排除符号链接和文件),按修改时间从新到旧排序,取前2个就是最新的目录。
  3. 保留名单构建:把符号链接指向的目录和最新2个目录合并,去重后得到完整的保护名单。
  4. 安全删除:遍历所有目录,只删除不在保护名单里的内容,完全避免误删需要保留的目录和符号链接。

调整说明

如果你的需求是“保留符号链接+它指向的目录+总共2个目录”(而不是额外加2个),只需要把head -n 2改成head -n 1,这样最终保留的就是目标目录+1个最新目录+符号链接,和你期望的结果一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:06:40