Есть много способов показать пакеты, установленные вручную apt
, например:
apt-mark showmanual
Но иногда это слишком много. Например, если пользователь установил пакет вручную foo
:
apt-get install foo
... и foo
зависит от, bar
а baz
затем apt-mark showmanual
будет вывод:
bar
baz
foo
Как мы можем перечислить только пакеты верхнего уровня, установленные вручную ( то есть foo
) без их зависимостей ( то есть, нет baz
, ни bar
)?
Следующий код, кажется, работает, но вызов GNU несколько сотен раз слишком медленный (три часа с 4-ядерным процессором):parallel
apt-rdepends
apt-mark showmanual |
tee /tmp/foo |
parallel "apt-rdepends -f Depends,PreDepends,Suggests,Recommends {} |
tail +2" 2> /dev/null |
tr -s ' ' '\n' |
grep -v '[():]' |
sort -Vu |
grep -wv -f - /tmp/foo
Ответы:
Это можно сделать с помощью API Python apt. Пакеты, в которых вы видите,
apt-mark showmanual
являются именно теми,apt.cache.Cache()
для которыхis_installed
верно иis_auto_installed
ложно. Но проще обработать зависимости:Даже в этом списке перечислены некоторые пакеты, которые я бы не ожидал увидеть там (
init
,grep
?!).источник
init
иgrep
(может быть, ваши подходящие данные повреждены?), Также он показывает слишком много библиотек. OTOH, мой 3-часовой код пропускает несколько элементов, которые должны быть там, элементы, которыеpython
печатает вышеуказанный код. Возможно, отсутствующие элементы не были установлены сapt
.python
код работает в 3600 раз быстрее (т.е. это заняло 3 секунды), чем мой код (3 часа). Заглядывая вперед к тестированию рекурсивной версии ...Следующий сценарий оболочки ищет родителей всех установленных зависимостей.
Я использовал
tsort
в этом сценарии. Я предполагаю, что при добавлении маркера в конце без зависимостей маркер также будет последней записью без зависимостей в моем результате. Поэтому я могу различить последний пакет без зависимостей и первый пакет с зависимостями.Я заметил одну проблему с этим решением:
в графе зависимостей есть циклы. Эти записи игнорируются
tsort
.источник
Вы можете найти все установленные вручную пакеты без их 1-го уровня зависимостей следующим образом:
Вы также можете использовать следующую однострочную магию:
источник
dasher
пакет. В моей системе код OP поступает черезsort -V
выходы 475 линий, Мура в кодовых выходах 914 линий ( в том числеdasher
), и выводит код этого ответа в 995 строк.