Я установил Ubuntu на новый Lenovo T470. Чтобы установить те же пакеты, что и на старом ноутбуке, я создал список установленных пакетов на старом ноутбуке и установил их на новом Lenovo, используя Как вывести список всех установленных пакетов .
Теперь у меня почти все пакеты помечены как установленные вручную (некоторые комментарии я прочитал слишком поздно) - autoremove
не будет работать правильно.
Я хотел бы исправить ручные / автоматические флаги зависимых пакетов на auto.
Я думаю, мне нужно предпринять следующие шаги:
Создать список всех установленных пакетов
apt-mark showmanual >installed_packages.txt
apt-mark showauto >>installed_packages.txt
Получить зависимости (довольно длительный процесс)
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:
Установить автоматический флаг для всех зависимых пакетов
cat dependencies_uniq.txt | xargs sudo apt-mark auto
Являются ли эти шаги правильными? Являются ли зависимости, извлеченные apt-cache depends --important
, такими же, как выбранные для установки APT при установке пакета?
Есть ли лучший способ исправить эти флаги?
Использование 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
, чтобы выполнить эти изменения.
Используя 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
и назовите «задача, статус», чтобы сделать список легче для чтения.)