Esta função deve remover dups.
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
}
Copia a lista de diretórios, exceto o primeiro que é falso, em uma matriz copy
e para cada diretório adiciona-o a uma matriz new
se ainda não tivermos seen
it (uma matriz associativa) . Isso garante que as entradas antigas de dup, que são posteriores na matriz, não sejam copiadas.
A lista dir está desmarcada e a matriz é pushd
na ordem inversa.
O primeiro elemento falso da lista dirs é o diretório atual, que não é alterado. Ele é definido na matriz seen
no início para também removê-lo se for anterior na lista de diretórios.
Se você quiser fazer isso automaticamente, você pode substituir pushd
, por exemplo:
pushd(){
builtin pushd "$@"
dedup
}