Случайно запустил «apt install *» теперь все пакеты помечены как «установленные вручную»

Случайно запустил «apt install *» теперь все пакеты помечены как «установленные вручную»

Я случайно запустил apt install '*'. Хотя он ничего не установил из-за конфликтов (например, нескольких версий редактора vim), все установленные пакеты потеряли свое свойство "автоматически", что означает, что я больше не могу пользоваться автоматической проверкой зависимостей APT. То есть, если я удаляю vim, apt больше не предлагает мне удалить vim-runtime. Я использую урезанную версию Advanced Packaging Tool, поэтому apt-markон недоступен. Как мне восстановить automaticсвойство для тех, которые зависят от другого?

Примечание: У меня есть apt, apt-get, apt-cache, apt-configи apt-keyдоступны.

решение1

В Debian и производных информация о ручной и автоматической установке хранится в /var/lib/apt/extended_states. Автоматических резервных копий и журналов нет. Если у вас есть резервная копия этого файла, восстановите ее.

Если у вас нет резервной копии, сначала сделайте ее на случай, если вы ее создадите. Затем для каждого пакета измените строку Auto-Installed: 0на , Auto-Installed: 1чтобы отметить пакет как установленный вручную.

APT сам по себе не отслеживает зависимости установленных пакетов, это делает dpkg. Информация есть в /var/lib/dpkg/statusDebian. Aptitude имеет расширенную функцию поиска, которая может работать с зависимостями, но не apt. Вы можете выполнить некоторый произвольный анализ /var/lib/dpkg/status. Следующий скрипт (минимально протестированный) генерирует список пакетов, от которых зависит какой-либо установленный пакет:

</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

Просмотрите этот список и, возможно, удалите некоторые строки, которые являются пакетами, которые являются зависимостями, но которые вы знаете, что хотите сохранить независимо от этого. Затем используйте это для настройки /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

Просмотрите выходной файл и переместите его на место, если вас все устраивает.

Связанный контент