语境
- 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
}