从 pushd/popd 路径中删除重复项

从 pushd/popd 路径中删除重复项

语境

  • linux bash
  • Pushd/POPD/目录

问题

问题场景与此问题中所述的场景非常相似:删除或清除 popd/pushd 路径堆栈...但是目标不是清除堆栈,而是修剪它。具体来说,剪枝操作就是去除重复项。

问题

有没有一种直接的方法来修剪输出,dirs -v -p使堆栈中没有重复项?

答案1

此功能应该删除重复项。

dedup(){
    declare -a new=() copy=("${DIRSTACK[@]:1}")
    declare -A seen
    local v i
    seen[$PWD]=1
    for v in "${copy[@]}"
    do if [ -z "${seen[$v]}" ]
       then new+=("$v")
            seen[$v]=1
       fi
    done
    dirs -c
    for ((i=${#new[@]}-1; i>=0; i--))
    do      builtin pushd -n "${new[i]}" >/dev/null
    done
}

它将目录列表(第一个目录除外,因为第一个目录是伪造的)复制到一个数组中copy,并且对于每个目录,new如果我们还没有将seen其添加到数组中(关联数组),则将其添加到数组中。这确保不会复制较旧的重复条目(位于数组中较晚的位置)。目录列表将被清除,然后数组将按pushd相反顺序排列。

dirs 列表的第一个伪造元素是当前目录,该目录未更改。它seen在开始时设置在数组中,如果在目录列表中较早,也可以将其删除。

如果您想自动执行此操作,您可以覆盖pushd例如:

pushd(){
    builtin pushd "$@"
    dedup
}

相关内容