
Я случайно запустил 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/status
Debian. 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
Просмотрите выходной файл и переместите его на место, если вас все устраивает.