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

50

Как мне перечислить как программы, которые пришли с моим дистрибутивом, так и те, которые я установил вручную?

InquilineKea
источник
8
Какой дистрибутив? Каждый дистрибутив имеет разные инструменты для установки.
Маттео
Хм, меня интересуют Red Hat, Ubuntu и cygwin. Есть ли способ распространения программ без аргумента командной строки?
InquilineKea
1
Нет, нет, поскольку менеджеры пакетов отличаются.
Крис Даун

Ответы:

73

Это зависит от вашего распространения.

  • Дистрибутивы на основе aptitude (Ubuntu, Debian и т. Д.): dpkg -l
  • RPM-дистрибутивы (Fedora, RHEL и т. Д.): rpm -qa
  • дистрибутивы на основе pkg * (OpenBSD, FreeBSD и т. д.): pkg_info
  • Дистрибутивы на основе Portage (Gentoo и т. Д.): equery listИлиeix -I
  • дистрибутивы на основе pacman (Arch Linux и т. д.): pacman -Q
  • Cygwin: cygcheck --check-setup --dump-only *
  • Slackware: slapt-get --installed

Однако все они будут содержать список пакетов, а не программ . Если вы действительно хотите перечислить программы, вы, вероятно, захотите перечислить исполняемые файлы в вашем $PATH, что можно сделать так, используя bash compgen:

compgen -c

Или, если у вас нет compgen:

#!/bin/bash
IFS=: read -ra dirs_in_path <<< "$PATH"

for dir in "${dirs_in_path[@]}"; do
    for file in "$dir"/*; do
        [[ -x $file && -f $file ]] && printf '%s\n' "${file##*/}"
    done
done
Крис Даун
источник
4
А для систем ППД на основе (Red Hat, SuSE, CentOS и т.д.):rpm -qa
БДУ
1
Debian / Ubuntu есть dkpg -l | grep ^ii.
Рольф
1
@Rolf, ты имеешь в виду dPKg
Харкали Герго
1
Хммм ... BSD не являются дистрибутивами Linux ...
Кусалананда
1
@ Кусалананда, а? В этом ответе нигде не говорится, что BSD являются дистрибутивами Linux, но они являются дистрибутивами . Это буквально то, что означает "D" в BSD.
Крис Даун
13

Отвечая на вторую часть вопроса (на самом деле ничего нельзя добавить к ответу Криса на первую часть) :

Как правило, нет способа перечисления установленных вручную программ и их компонентов. Это нигде не записывается, если вы не использовали менеджер пакетов. Все, что вы можете сделать, это найти двоичные файлы в стандартных местах (как предложил Крис) и подобным образом угадать, откуда взялись некоторые библиотеки или несколько страниц справочника и т. Д. Вот почему, по возможности, вы всегда должны устанавливать программы, используя менеджер пакетов .

rozcietrzewiacz
источник
3

Программы должны быть доступны через PATH, поэтому просто перечислите все по пути:

ls ${PATH//:/ }

Ожидайте результат около 3k-4k программ.

Чтобы исключить возможное меньшинство ложных срабатываний, вы можете уточнить подход:

for d in ${PATH//:/ } ; do 
    for f in $d/* ; do  
        test -x $f && test -f $f && echo $f
    done
done

Это не имело значения для меня.

неизвестный пользователь
источник
2
Обратите внимание, что это также потенциально может перечислять различные непрограммы (подкаталоги каталогов в $PATHи т. Д.).
Крис Даун
1
Я добавил тест, но для меня это не имело значения (насколько полезен каталог в каталоге в пути, который сам не находится в пути?). Но для случаев, когда вы полагаетесь на правильность, это может быть полезно.
пользователь неизвестен
1
классно! Я не смог узнать версию Linux (длинная история - но ничего криминального), но этот код спас мой день :)
obenjiro
2

Все остальные ответы (пока) касаются пакетов и двоичных файлов. Если вы имеете в виду «настольные приложения», которые появляются в вашем меню «Пуск», вы можете попробовать:

ls /usr/share/applications | awk -F '.desktop' ' { print $1}' -

Больше решений в другом вопросе .

Рольф
источник