Execute acidentalmente "apt install *" agora todos os pacotes estão marcados como "instalados manualmente"

Execute acidentalmente "apt install *" agora todos os pacotes estão marcados como "instalados manualmente"

Eu acidentalmente corri apt install '*'. Embora não tenha instalado nada devido a conflitos (por exemplo, múltiplas versões do vimeditor), todos os pacotes instalados perderam sua propriedade "automática", o que significa que não posso mais aproveitar a verificação automática de dependência do APT. Ou seja, se eu remover vim, o apt não solicitará mais que eu remova vim-runtime. Estou usando uma versão simplificada do Advanced Packaging Tool, portanto apt-marknão está disponível. Como posso restaurar a automaticpropriedade daqueles que dependem de outra pessoa?

Nota: tenho apt, apt-get, apt-cachee disponíveis apt-config.apt-key

Responder1

No Debian e derivados, as informações sobre instalação manual versus instalação automática são armazenadas em arquivos /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, primeiro faça um, caso você faça as pazes. Em seguida, para cada pacote, altere a linha Auto-Installed: 0para Auto-Installed: 1para marcar o pacote como instalado manualmente.

O próprio APT não rastreia as dependências dos pacotes instalados, isso é feito pelo dpkg. A informação está /var/lib/dpkg/statusno Debian. O Aptitude possui uma funcionalidade de pesquisa avançada que pode operar em dependências, mas não no apt. Você pode fazer uma análise ad hoc do arquivo /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 são dependências, mas que você sabe que deseja manter independentemente. Então 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.

informação relacionada