Acione acidentalmente “apt install *” agora todos os pacotes estão marcados como “manualmente instalados”

1

Eu acidentalmente executei apt install '*' . Embora não tenha instalado nada devido a conflitos (por exemplo, várias versões do editor vim ), todos os pacotes instalados perderam sua propriedade "automática", o que significa que não posso mais aproveitar a verificação de dependência automática do APT. Ou seja, se eu remover vim , o apt não pedirá mais para remover vim-runtime . Estou usando uma versão simplificada da Advanced Packaging Tool, portanto, apt-mark não está disponível. Como posso restaurar a propriedade automatic para aqueles que são dependentes de outra?

Observação: tenho apt , apt-get , apt-cache , apt-config e apt-key disponível.

    
por iBug 22.04.2017 / 13:20

1 resposta

2

No Debian e derivados, as informações sobre instalação manual vs automática são armazenadas em /var/lib/apt/extended_states . Não há backups automáticos nem registros. Se você tiver um backup desse arquivo, restaure-o.

Se você não tiver um backup, faça primeiro um caso você faça as malas. Em seguida, para cada pacote, altere a linha Auto-Installed: 0 para Auto-Installed: 1 para marcar o pacote como instalado manualmente.

O próprio APT não controla as dependências dos pacotes instalados, o que é feito pelo dpkg. As informações estão em /var/lib/dpkg/status no Debian. Aptitude tem uma funcionalidade de pesquisa avançada que pode operar em dependências, mas não apt. Você pode fazer uma análise ad hoc de /var/lib/dpkg/status . O script a seguir (minimamente testado) gera uma lista de pacotes dos quais alguns pacotes instalados dependem:

</var/lib/dpkg/status awk '
    /^Package:/ {package=$2}
    /^Status:/ && $4 != "installed" {package=""}
    /^(Depends|Pre-Depends|Recommends|Suggests):/ && package != "" {
        sub(/^[^:]*: */, "");
        gsub(/ (\([^()]*\))/, "");
        split($0, dependencies, /[|, ]+/);
        for (d in dependencies) print dependencies[d]}
' | sort -u >dependencies.txt

Revise essa lista e, talvez, remova algumas linhas que são pacotes que, por acaso, são dependências, mas que você sabe que vai querer manter, mesmo que sejam indiferentes. Em seguida, use isso para ajustar /var/lib/apt/extended_states :

</var/lib/apt/extended_states awk '
    BEGIN {
        while (getline <"dependencies.txt") auto[$0]=1;
        RS="";
    }
    $2 in auto {sub(/\nAuto-Installed: 0/, "\nAuto-Installed: 1")}
    {print $0 "\n"}
' >extended_states.new

Revise o arquivo de saída e mova-o para o lugar se estiver satisfeito.

    
por 23.04.2017 / 02:32

Tags