Как исправить флаги автоматической / ручной установки установленных пакетов?

Я установил Ubuntu на новый Lenovo T470. Чтобы установить те же пакеты, что и на старом ноутбуке, я создал список установленных пакетов на старом ноутбуке и установил их на новом Lenovo, используя Как вывести список всех установленных пакетов .

Теперь у меня почти все пакеты помечены как установленные вручную (некоторые комментарии я прочитал слишком поздно) - autoremove не будет работать правильно.

Я хотел бы исправить ручные / автоматические флаги зависимых пакетов на auto.

Я думаю, мне нужно предпринять следующие шаги:

  1. Создать список всех установленных пакетов

    apt-mark showmanual >installed_packages.txt
    apt-mark showauto >>installed_packages.txt
    
  2. Получить зависимости (довольно длительный процесс)

    for PACKAGE in $( sort installed_packages.txt ); do
        apt-cache depends ${PACKAGE} --important -q --installed | awk '/epends:/ {print $2}' >>dependencies_all.txt
    done
    sort -u dependencies_all.txt > dependencies_uniq.txt
    

    Обратите внимание на опцию --important apt-cache. AWK будет печатать только имя пакета из Depends: и PreDepends:

  3. Установить автоматический флаг для всех зависимых пакетов

    cat dependencies_uniq.txt | xargs sudo apt-mark auto
    

Являются ли эти шаги правильными? Являются ли зависимости, извлеченные apt-cache depends --important, такими же, как выбранные для установки APT при установке пакета?

Есть ли лучший способ исправить эти флаги?

2
задан 16 February 2018 в 10:40

2 ответа

Использование Python Apt API может быть более эффективным, особенно при получении зависимостей:

#! /usr/bin/python3
from apt import cache

c = cache.Cache()
pkgs = set(pkg for pkg in c if pkg.is_installed)
seen = set()

def mark_deps(pkg):
    for dep in pkg.installed.dependencies:
        for ver in dep.installed_target_versions:
            if ver.package not in seen:
                seen.add(ver.package)
                pkg.mark_auto()
                mark_deps(ver.package)


for pkg in pkgs:
    mark_deps(pkg)

print(c.get_changes())
c.commit()

Это все равно будет работать медленно, но все равно должно быть быстрее, чем вызов apt-cache тысячи раз. Запустите без sudo, чтобы увидеть, какие изменения будут внесены (c.commit() потерпит неудачу), и запустите sudo, чтобы выполнить эти изменения.

1
ответ дан 16 February 2018 в 10:40

Используя aptitude, вы можете установить предел (нажмите «l», строчная буква L) и введите это заклинание, чтобы увидеть все пакеты, которые установлены и не помечены как автоматические, но для которых помечать их как автоматические не удаляйте их, потому что есть другой установленный пакет, который уже зависит от них:

?and(?or(?reverse-predepends(~i),?reverse-depends(~i)),?and(~i,!~M))

Ниже показаны все установленные вами пакеты, которые не помечены как автоматические и не имеют ничего, что зависит от них:

?and(?not(?or(?reverse-predepends(?and(~i,!~M)),?reverse-depends(?and(~i,!~M)))),?and(~i,!~M))

(Нажмите G и назовите «задача, статус», чтобы сделать список легче для чтения.)

0
ответ дан 16 February 2018 в 10:40

Другие вопросы по тегам:

Похожие вопросы: