Сбросить выбор dselect перед установкой пакета

Сбросить выбор dselect перед установкой пакета

Я просматривал список пакетов с помощью dselect, но Returnпо ошибке нажал дважды, тем самым подтвердив и выйдя из [S]electопции.

Когда я перехожу к этой [I]nstallопции, она теперь предлагает установить ряд новых пакетов, которые мне не нужны (и которые не имеют ничего общего с тем, что я искал изначально).

Поскольку я еще не приступил к установке, есть ли способ сбросить выбор до того состояния, в котором он был до выбора новых пакетов, не проходя по списку по одному и не нажимая -для каждого пакета? (Неважно, делается ли это с помощью команды dselectили с помощью другой связанной команды.)

EDIT: (добавляю пример)

Я пробовал на другой машине, где dselectустановлен. Предположим, что пакет gnugoне установлен (это просто пример).

  • Запустите delectи выберите [S]electполучение списка.
  • Найдите gnugoв этом списке (используйте /, если вы не знакомы с dselect).
  • Выберите его с помощью +.
  • Нажмите Return, чтобы подтвердить предложения, и Returnеще раз, чтобы подтвердить возврат в главное меню (ошибка, которую я совершил).
  • Перейти к [I]nstall. Теперь там будет написано:

    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    The following NEW packages will be installed
      gnugo:i386 libgpm2:i386 libncurses5:i386 libreadline6:i386 libtinfo5:i386
    0 upgraded, 5 newly installed, 0 to remove and 0 not upgraded.
    Need to get 1,926 kB of archives.
    After this operation, 9,634 kB of additional disk space will be used.
    Do you want to continue [Y/n]? 
    
  • Здесь выберите вариант «Не продолжать» ( n).

  • Покидать dselect.
  • dpkg --get-selections | grep gnugoвообще ничего не дает.
  • Начните dselectснова, перейдите [I]nstallснова, пакеты по-прежнему будут выбраны для установки.

Конечно, я могу вернуться в [S]electсписок, выполнить поиск gnugoи нажать , _чтобы снять выделение, но в более сложном случае вам, возможно, придется просмотреть список новых пакетов один за другим.

[I]nstallin dselect— это, по-видимому, интерфейс к apt-get install, но я не уверен, откуда он берет свой выбор. Похоже, dpkg --get-selectionэто не он. Что касается dselectменя, я бы хотел сбросить его в состояние, когда все, что сделано с , ***остается в том же состоянии, что и было, но то, что теперь отмечено как только **(и еще не установлено), возвращается к __, без необходимости вручную проходить через предлагаемый список из [I]nstallменю.

ПРАВКА 2:

Это явно связано с содержанием /var/lib/dpkg/status, в котором содержится следующая запись:

Package: gnugo
Status: install ok not-installed
Priority: optional
Section: games

Если я изменю это значение вручную на Status: deinstall ok not-installed, оно исчезнет из выделения dselect(что имеет смысл).

Мне бы хотелось иметь общий способ превращения всего, что говорится, Status: install ok not-installedв Status: deinstall ok not-installed(оставляя пакеты, говорящие об этом, Status: install ok installedнеизменными).

решение1

Используйте --set-selectionsаргумент * для dpkg:

echo "<package-name> purge" | dpkg --set-selections

Затем вы можете использовать apt-get dselect-upgradeдля применения выбранного вами пакета.


Если вам нужно найти пакеты, которые были выбраны для установки, но еще не установлены (чтобы можно было отменить этот выбор), используйте это:

dpkg --get-selections | awk '{ if ($2=="install") print $1}' | grep -vF "$(dpkg -l | awk '/^ii/ {print $2}')"

Вы можете пойти немного дальше и перенаправить это обратно в --set-selections, тем самым автоматически отменив выбор всего, что еще не установлено:

dpkg --get-selections | awk '{ if ($2=="install") print $1,"deinstall"}' | grep -vF "$(dpkg -l | awk '/^ii/ {print $2}')" | dpkg --set-selections

*Вы также можете использовать dpkg --get-selectionsдля перечисления всех явных выборов. Это также покажет вам требуемый формат --set-selections.

решение2

Оказывается, в нем dpkg --get-selectionsне перечислено то, что отмечено для установки и еще не установлено, но dpkg -l '*'есть, и эти строки начинаются с in.

В результате следующая строка сбрасывает эти выборки:

dpkg -l '*' | grep '^in ' | awk '{ print $2 " deinstall" }' | dpkg --set-selections

решение3

ИспользоватьСпособность'sвозможности поискадля получения списка.

aptitude -F '%p' search '~ainstall !~i'

Передайте список, чтобы dpkg --set-selectionsотметить их как подлежащие удалению.

aptitude -F '%p deinstall' search '~ainstall !~i' | dpkg --set-selections

Кстати: добро пожаловать в 21 век, предлагаю перейти на Aptitude вместо Dselect.

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