Я хотел бы получить список пакетов, установленных вручную apt
или, aptitude
и иметь возможность узнать, был ли foobar
пакет установлен вручную или автоматически. Есть ли какой-нибудь аккуратный способ сделать это из командной строки?
Я хотел бы получить список пакетов, установленных вручную apt
или, aptitude
и иметь возможность узнать, был ли foobar
пакет установлен вручную или автоматически. Есть ли какой-нибудь аккуратный способ сделать это из командной строки?
Ответы:
Вы можете использовать любой из этих двух однострочников. Оба дают одинаковый результат на моей машине и более точны, чем все решения, предложенные до сих пор (6 июля 2014 г.) в этом вопросе.
Использование apt-mark
:
comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)
Использование aptitude
:
comm -23 <(aptitude search '~i !~M' -F '%p' | sed "s/ *$//" | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)
Очень немногие пакеты по-прежнему попадают в трещины, хотя я подозреваю, что они на самом деле устанавливаются пользователем, либо сразу после установки через настройку языковой локализации, либо, например, через установщик кодеков Totem. Кроме того, версии заголовков linux также накапливаются, хотя я установил только не зависящий от версии метапакет. Примеры:
libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29
Как это работает:
sed
удаляют оставшиеся пробелы в конце строки.Другие возможности не работают так же хорошо:
ubuntu-14.04-desktop-amd64.manifest
файла ( здесь для Ubuntu 14.04) вместо /var/log/installer/initial-status.gz
. Дополнительные пакеты отображаются как установленные вручную, хотя это не так.apt-mark showauto
вместо /var/log/installer/initial-status.gz
. apt-mark
например, не включает пакет xserver-xorg, в то время как другой файл включает.Я использовал различные другие сообщения StackExchange в качестве ссылок, однако ни одна из них не работает так же хорошо, как приведенное выше решение:
Оба перечисляют больше пакетов, чем приведенное выше решение.
РЕДАКТИРОВАТЬ: Что делать, если вы обновились с предыдущего выпуска:
Если вы обновили Ubuntu с одного выпуска на другой, вам, вероятно, придется настроить этот процесс. В этом случае я бы проверил файл манифеста более новой версии (см. Выше) в дополнение к файлу initial-status.gz из текущей версии. Вы можете легко сделать это, просто добавив еще одно сравнение. Использование только файла манифеста не будет работать, так как, к сожалению, файл манифеста не содержит всего, что делает файл initial_status.gz (я проверял).
/var/log/installer/initial-status.gz
отсутствует. Также я хочу знать, зависит ли это от маркировки apts manual
или нет?
showmanual
команду (ниже). И используйте comm
для сравнения двух (отсортированных) списков. showmanual
Результат дал мне 1840 более уникальные пакеты из apt-mark showmanual
не показанных этого метода. НИКАКИЕ пакеты не были уникальными для вывода этой comm
-команды. Я думаю, что более интересно записать, что для моего ПК в обоих результатах указано 894 пакета. Не уверен, почему есть такое огромное несоответствие. Некоторые (многие?) Пакеты, похоже, зависят от версии. Другие, такие как XOrg, компоненты GTK и другие, lib*
могут быть обновлениями. В любом случае, этот ответ - очень хорошее начало.
apt-mark showmanual
. Интересно, сколько различий видно. Ваш список содержит 238 пакетов, а showmanual возвращает 1717 пакетов. Из 2179 установленных пакетов только 223 в обоих списках, 15 только в вашем (примеры: nodejs, lightdm) и 223 только в showmanual (примеры: xserver-xorg, ubuntu-desktop). Такое ощущение, что ваш список более полезен, но, не зная, откуда эти различия, нелегко решить ... (но я совершенно уверен, что я вручную установил nginx и lightdm ...) [извините, я только что написал то же самое;)]
В более новых версиях пакета apt есть также команда apt-mark
apt-mark showmanual
linux-image-3.11.0-*-generic
т.д. как руководство
linux-image-3.13.0-24-generic
вручную, а ток linux-image-3.13.0-27-generic
автоматически. Похоже, что при обновлении ссылочного пакета (в данном случае linux-image-generic
изменились зависимости) автоматически устанавливается ручная отметка
apt-get autoremove
. Это определенно не то, что вы хотите.
Для Ubuntu 16.04 проверьте файл журнала /var/log/apt/history.log
.
Например:
zgrep 'Commandline: apt' /var/log/apt/history.log /var/log/apt/history.log.*.gz
Он не идеален, но он довольно хорош, чтобы прояснить, что именно я установил вручную. Положите -B 1
на grep, чтобы увидеть, когда он был установлен.
Пример вывода
Commandline: apt install postgresql-9.5-plv8
Commandline: aptdaemon role='role-install-file' sender=':1.85'
Commandline: apt install task
Commandline: apt autoremove
Commandline: apt install atom
Commandline: apt upgrade
Commandline: apt-get install asciinema
Commandline: apt install iperf3
Commandline: apt upgrade
Commandline: apt-get install chromium-browser
Commandline: apt install joe cpanminus build-essential postgresql libdbd-pg-perl libcrypt-openssl-bignum-perl libcrypt-openssl-rsa-perl libio-socket-ssl-perl libnet-ssleay-perl libssl-dev
Commandline: aptdaemon role='role-commit-packages' sender=':1.2314'
Commandline: apt install git
Commandline: apt install sqlite
Commandline: apt install whois
Commandline: apt install libdbd-pg-perl
Commandline: apt install perl-doc
Commandline: apt upgrade
Не уверен, что это подхватит aptitude
или нет. Похоже, он не забирает установки из настольного приложения Ubuntu Software.
apt-mark showauto | grep -iE '^foobar$'
выведет «foobar», если пакет был установлен автоматически, иначе ничего.
aptitude search '!~M ~i'
перечислит пакеты, которые не были установлены автоматически. Жаль, что способность не будет частью установки по умолчанию на Ubuntu Desktop, начиная с 10.10.
aptitude search
показывает ВСЕ пакеты, а не только те, которые установлены вручную (я полагаю, это то, что хотел ОП)
aptitude search '!~M ~i'
и он перечисляет 1043 пакетов. Я не могу установить столько пакетов вручную.
Следующий скрипт распечатает все пакеты, которые не установлены для автоматической установки и, следовательно, были установлены вручную:
#!/usr/bin/python
try:
import apt_pkg
except ImportError:
print "Error importing apt_pkg, is python-apt installed?"
sys.exit(1)
apt_pkg.init()
STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states"
auto = set()
tagfile = apt_pkg.TagFile(open(STATE_FILE))
while tagfile.step():
pkgname = tagfile.section.get("Package")
autoInst = tagfile.section.get("Auto-Installed")
if not int(autoInst):
auto.add(pkgname)
print "\n".join(sorted(auto))
это основано на том, как apt-mark распечатывает автоматически установленные пакеты.
sys.exit(1)
без import sys
может привести к ошибке в более новых версиях Python. Либо import sys
или используй exit(1)
.
Чтобы получить список всех пакетов (не установленных, установленных пользователем или установленных по умолчанию для всех PPA), apt
используется следующий метод:
apt list [option]
Возможные варианты, полезные для этого:
--installed
отображать только те пакеты, которые установлены в системе (из примерно 50 000+)
--manual-installed
перечислить пакеты, которые были явно установлены командой, либо напрямую, либо как зависимости.
В качестве альтернативы вы можете сделать:
apt list --manual-installed | grep -F \[installed\]
получить список пакетов, полученных только из пользовательских команд и их зависимостей, и получить дополнительную информацию о них, такую как поддерживаемая версия и архитектура (x86, x86_64, amd64, все и т. д.)
Как прокомментировали несколько человек, шоу apt-mark showmanual выглядит немного глючно (и я сообщил об этом как об ошибке 727799 ). Когда я его использую, он на самом деле сообщает о многих вещах, которые даже не зарегистрированы в / var / lib / apt / extended_states (где это должно храниться), и apt-get не регистрирует вещи как установленные в / var / lib / apt / extended_states (только в / var / lib / dpkg / status). Сценарий python от txwikinger, приведенный выше, напрямую обращается к / var / lib / apt / extended_states, но если вы используете его сегодня, синтаксис может не работать (мой только что начал генерировать ошибки с Kubuntu 13.10). Обновленный синтаксис:
#!/usr/bin/python
import sys
try:
import apt_pkg
except ImportError:
print "Error importing apt_pkg, is python-apt installed?"
sys.exit(1)
apt_pkg.init()
STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states"
auto = set()
tagfile = apt_pkg.TagFile(open(STATE_FILE))
while tagfile.step():
pkgname = tagfile.section.get("Package")
autoInst = tagfile.section.get("Auto-Installed")
if not int(autoInst):
auto.add(pkgname)
print "\n".join(sorted(auto))
Для меня это был очень короткий список из 5 пунктов, который тоже не совсем точен.
sys.exit(1)
без import sys
может привести к ошибке в более новых версиях Python. Либо import sys
или используй exit(1)
.
Я хотел бы дать решение GUI.
открыто Synaptic Package Manager
Перейти к Status
Нажмите Installed (manual)
Он выдаст список пакетов, установленных вручную с помощью apt или aptitude.
К сожалению, я не смог найти никакой опции, Custom Filters
чтобы узнать, был ли foobar
пакет установлен вручную или автоматически.
Если пакет находится под, Installed
но не под, Installed (manual)
то он был установлен автоматически. Если пакет находится под, Installed (manual)
то он был установлен вручную.
Если никто не дает вам хороший ответ с помощью команды apr-что-то, вы можете сделать это трудным путем . Apt-get хранит свою информацию в / var / lib / apt / extended_states. Любой файл, который устанавливается автоматически, будет добавлен в этот файл. Если вы устанавливаете пакет уже в этом файле вручную, пакет останется в этом файле, но с автоматически установленным: 0 во второй строке. Это не удалено.
Примечание. Как и ожидалось, лучше будут ответы, которые могут сработать, если появятся изменения размещения файлов. Я оставляю свои на всякий случай, если информация о расположении файла полезна.
apt-get install liferea
и он не установился, но я получил вывод, который был чем-то вроде «помечен как установленный вручную». Теперь liferea все еще находится в файле, за исключением того, что в следующей строке 0
вместо a 1
. Кроме того, вы должны изменить свой шаблон регулярных выражений " foobar$"
вместо просто foobar
.
После долгих поисков, мне удалось собрать этот скрипт. Это работает хорошо для меня:
# List of all packages currently installed
current=$(dpkg -l | awk '{print $2}' | sort | uniq)
# List of all packages that were installed with the system
pre=$(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort | uniq)
# List of packages that don't depend on any other package
manual=$(apt-mark showmanual | sort | uniq)
# (Current - Pre) ∩ (Manual)
packages=$(comm -12 <(comm -23 <(echo "$current") <(echo "$pre")) <(echo "$manual") )
for pack in $packages; do
packname=$(echo $pack | cut -f 1 -d ":")
desc=$(apt-cache search "^$packname$" | sed -E 's/.* - (.*)/\1/')
date=$(date -r /var/lib/dpkg/info/$pack.list)
echo "# $desc"
echo "# $date"
echo "sudo apt-get install $pack"
echo -e ""
done
sort -u
вместо sort | unique
. Поскольку apt-mark
не отображает архитектуру, вы должны удалить ее из вывода dpkg перед выполнением операций set (или использованием dpkg-query -W -f='${Package}\n'
). Кроме того, dpkg может перечислить некоторые пакеты, которые не установлены в настоящее время. Что касается "desc", вы можете использовать `dpkg-query -W -f = '# $ {binary: Summary} \ n' $ pack, что быстрее.
apt-mark
может отображать архитектуру для некоторых пакетов, но не для многих dpkg -l
.
apt-cache search
медленный. Заранее получить список установленных дат, используя что-то вроде help.ubuntu.com/community/ListInstalledPackagesByDate, может быть более эффективным
Как сказал Ли Ло, apt-mark showauto
вы должны получить полный список автоматически установленных вещей.
Теперь, чтобы показать вещи, которые установлены вручную, оказалось, что есть замечательный простой модификатор поиска для aptitude. Но ты не хочешь этого делать. Вы хотите написать огромную команду bash, которая занимается ракетостроением.
Примечание. Это еще одна иллюстрация того, как здорово вы будете выглядеть, выполняя массовые команды bash всем своим друзьям.
comm -3 <(dpkg-query --show -f '${Package} ${Status}\n' | \n
grep "install ok installed" | cut --delimiter=' ' -f 1) <(apt-mark showauto)
Я разбил его на две строки для удобства чтения. Что это делает?
apt-mark
comm -3 <(dpkg -l | grep '^ii' | cut -d \ -f 3|sort) <(apt-mark showauto|sort)
по-настоящему лучше;)
В этом списке перечислены все установленные вручную пакеты без: зависимостей, удаленных пакетов, пакетов, установленных во время установки системы.
unopts() {
in=`cat`
echo "$in" | sed -r 's/ --[^ ]+//g;s/ -[^ ]+//g'
}
list() {
cat '/var/log/apt/history.log' |
grep --color=never -v '\-o APT::Status-Fd=4 \-o APT::Keep-Fds::=5 \-o APT::Keep-Fds::=6' |
egrep --color=never "Commandline: apt-get.* $1" |
sed -r "s/Commandline: apt-get//;s/ $1//" |
unopts |
tr ' ' '\n' |
sed '/^$/d'
}
hapt() {
tmp=`mktemp -d`
installed=$tmp/installed
deleted=$tmp/deleted
dpkg=$tmp/dpkg
list 'install' > $installed
list '(remove|purge|autoremove)' > $deleted
dpkg --get-selections |
grep -v 'deinstall' |
cut -f 1 > $dpkg
while read package
do
sed -i "0,/$package/{//d;}" $installed
done < $deleted
while read package
do
if [ -z "`grep --color=never "^$package$" $dpkg`" ]
then
sed -i "0,/$package/{//d;}" $installed
fi
done < $installed
cat $installed
rm -r $tmp
}