问题场景与此问题中所述的场景非常相似:删除或清除 popd/pushd 路径的堆栈……但是目标不是清除堆栈,而是修剪它。具体来说,剪枝操作就是去除重复项。
有没有一种直接的方法来修剪输出,dirs -v -p
使得堆栈中没有重复项?
此功能应该删除重复项。
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)