Как мне написать сценарий для получения того же списка установленного программного обеспечения, о котором сообщал Центр программного обеспечения Ubuntu?
В каждой ссылке, которую я могу найти, упоминается либо dpkg -l или rpm -qa (или некоторые его вариант), но обычно они включают каждый последний пакет и библиотеку и все, что угодно, и в итоге вы получите список из 1000+ записей.
Тем не менее приложение Ubuntu Software Center показывает очень краткий (и удобный для человека) список - в настоящее время на моем Ubuntu есть 67 элементов. Это тот список, который меня интересует. Может кто-нибудь указать мне сценарий, который может получить что-то подобное? Желательно что-то, что может работать в других дистрибутивах, но я возьму все, что смогу получить.
Благодаря.
Вы можете получить данные из журналов в /var/log/apt
. Поскольку журналы вращаются, большинство из них сжаты. Сначала мы объединяем текущий журнал со сжатыми, прежде чем извлекать все установленные пакеты, но не автоматически. Это было просто методом проб и ошибок с моей стороны, так что, возможно, его можно немного исправить.
cd /var/log/apt
sudo -s
cat history.log > allhistory
zcat history.log*gz >> allhistory.log
cat allhistory.log | grep Install | sed s/Install://g | tr ')' '\n' | grep -v automatic | sed s/,//g | sed s/:.*$//g | sort -u | grep -v "^$"
Может все еще не быть тем, что вы ищете ...
dpkg --get-selections
Если нет (я пока не могу комментировать), запустите следующее и дайте мне знать число (просто считает количество строк.
dpkg --get-selections | wc -l
Может быть, APTonCD поможет?
Это инструмент, который сканирует установленные вами пакеты APT и создает список для вас. Затем вы можете вручную выбрать / отменить выбор тех, которые вам нужны, сохранить список, и он даже может загрузить / использовать кэш для сохранения выбранных пакетов в CD / папке (для автономной автоматической установки установленных на данный момент приложений)
Он также имеет несколько фильтров, таких как include-зависимости, старые версии и т. Д.
APTonCD поставляется по умолчанию в Mint 10, но, поскольку они используют одни и те же репозитории Ubuntu, вы можете установить его через менеджер программного обеспечения.
Насколько я могу судить, Центр программного обеспечения фильтрует на основе раздела, в котором находится пакет. Хотя он не будет точно таким же, как фильтр, который использует Центр программного обеспечения, вы можете сделать нечто подобное, отфильтровав библиотеку. пакеты:
dpkg --get-selections|grep -i -v "deinstall"|grep -v "lib"
grep предназначен для фильтрации вещей, которые либо не установлены, либо обычно скрыты центром программного обеспечения. Вы можете добавить больше вещей для фильтрации по мере необходимости - строка «lib» является хорошим индикатором того, что это не приложение конечного пользователя.
То, что, вероятно, показывает центр программного обеспечения (и что Вы подразумеваете под приложениями), .desktop
файлы. По существу они служат ярлыками на фактические двоичные файлы (думайте с точки зрения ярлыков Windows и .exe
файлы).
Большинство (но не все!) приложения, установленные через менеджера по программному обеспечению, имеют ярлык в /usr/share/applications
. Структура того файла - что-то вроде этого:
[Desktop Entry]
Name=My App Name
Exec=/full/path/to/binary
Comment=this app does something
Icon=/full/path/to/icon.png
Область действия приложения единицы анализирует эти файлы файлов для извлечения описания и названия приложения. Мы можем сделать что-то похожее с этой командой:
find /usr/share/applications/ -maxdepth 1 -type f -iname "*.desktop" | xargs awk -F '=' '/Desktop Entry/{seek=1}; {if(seek==1 && $0~/Name=/){$1="";print;seek=0;next}}'
В основном мы генерируем список всех они .desktop
файлы, проанализируйте их для извлечения строки с Name=
но только часть дисплея строки после =
знак.
Поскольку я упомянул, что некоторые приложения не имеют .desktop
файл ИЛИ может храниться в /opt
папка, таким образом, можно хотеть выполнить ту же команду (с -maxdepth 1
удаленный) на /opt
каталог также.
В Python вы можете получить список установленных пакетов следующим образом:
import apt
packages = apt.Cache()
packages.open()
installed_packages = [i.name for i in packages if i.is_installed]
Если вы хотите узнать дополнительную информацию о пакетах, процесс немного сложнее. Смотрите документацию для модуля Python apt для получения всей доступной информации. Кроме того, вы можете просмотреть источник в Центре программного обеспечения, чтобы узнать, что они делают.
Вы не получите эту информацию, просто взглянув на какой-нибудь файл или выполнив простую команду. Вам нужно будет сделать несколько сценариев.
РЕДАКТИРОВАТЬ: Я полагаю, что Software Center получает список пакетов для отображения из тех пакетов, которые поставляют файлы .desktop. Это может быть сложнее, но вы можете легко отфильтровать список по тем пакетам, которые установлены и имеют файл .desktop. Этот пример продолжает мой предыдущий код:
import os
desktop_files = ['.'.join(i.split('.')[:-1]) for i in os.listdir('/usr/share/applications')]
installed_in_software_center = [i for i in installed_packages if i in desktop_files]