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

dre*_*mac 5 bash pushd

语境

  • linux bash
  • 推送/弹出/目录

问题

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

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

meu*_*euh 3

此功能应该删除重复项。

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
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

pushd(){
    builtin pushd "$@"
    dedup
}
Run Code Online (Sandbox Code Playgroud)