Ejecute accidentalmente "apt install *" ahora todos los paquetes están marcados como "instalados manualmente"

Ejecute accidentalmente "apt install *" ahora todos los paquetes están marcados como "instalados manualmente"

Corrí accidentalmente apt install '*'. Aunque no instaló nada debido a conflictos (por ejemplo, múltiples versiones del vimeditor), todos los paquetes instalados perdieron su propiedad "automática", lo que significa que ya no puedo disfrutar de la verificación automática de dependencia de APT. Es decir, si elimino vim, apt ya no me solicita que lo elimine vim-runtime. Estoy usando una versión simplificada de Advanced Packaging Tool, por lo que apt-markno está disponible. ¿Cómo puedo restaurar la automaticpropiedad de aquellas que dependen de otro?

Nota : Tengo apt, apt-get, apt-cachey disponibles.apt-configapt-key

Respuesta1

En Debian y derivados, la información sobre la instalación manual y automática se almacena en formato /var/lib/apt/extended_states. No hay copias de seguridad automáticas ni registros. Si tiene una copia de seguridad de ese archivo, restáurela.

Si no tiene una copia de seguridad, primero haga una en caso de que la recupere. Luego, para cada paquete, cambie la línea Auto-Installed: 0para Auto-Installed: 1marcar el paquete como instalado manualmente.

APT en sí no realiza un seguimiento de las dependencias de los paquetes instalados, eso lo hace dpkg. La información está /var/lib/dpkg/statusen Debian. Aptitude tiene una funcionalidad de búsqueda avanzada que puede operar en dependencias, pero no en apt. Puede realizar un análisis ad hoc de /var/lib/dpkg/status. El siguiente script (mínimamente probado) genera una lista de paquetes de los que depende algún paquete instalado:

</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 esa lista y tal vez elimine algunas líneas que son paquetes que resultan ser dependencias pero que sabe que querrá mantener iguales de todos modos. Luego usa esto para modificar /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 el archivo de salida y muévalo a su lugar si está satisfecho.

información relacionada