removendo duplicatas dos caminhos pushd / popd

3

Contexto

  • bash do linux
  • pushd / popd / dirs

Problema

O cenário do problema é muito semelhante ao indicado nesta pergunta: removendo ou limpando a pilha de caminhos popd / pushd ... no entanto, o objetivo não é limpar a pilha, mas sim podar . Especificamente, a operação de remoção é remover duplicatas.

Pergunta

Existe uma maneira simples de remover a saída de dirs -v -p , de forma que não haja duplicatas na pilha?

    
por dreftymac 08.06.2016 / 19:12

1 resposta

2

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
}
    
por 08.06.2016 / 22:07

Tags