Я придумал этот ответ для людей, которые хотят использовать bash в хорошем смысле. Ясно, что ответ на этот вопрос связан со списком файлов из /usr/share/applications, но проблема в том, что ls команда никогда не должна анализироваться. В прошлом я совершал ту же ошибку, но теперь я узнал, что лучший способ - это использовать for цикл для перебора файлов, даже если мне придется использовать еще несколько клавиш с моей драгоценной клавиатуры:
for app in /usr/share/applications/*.desktop; do echo "${app:24:-8}"; done
Я также использовал в предыдущей команде манипулирование строками операции: удалены из app первые 24 символа, которые являются /usr/share/applications/ и последние 8 символов, которые являются .desktop.
Обновление:
Еще одно место, где вы можете найти приложения, показанные тире, - это ~/.local/share/applications/*.desktop. Итак, вам также нужно выполнить следующую команду:
for app in ~/.local/share/applications/*.desktop; do echo "${app:37:-8}"; done
Чтобы объединить две предыдущие команды, вы можете использовать:
for app in /usr/share/applications/*.desktop ~/.local/share/applications/*.desktop; do app="${app##/*/}"; echo "${app::-8}"; done
Записи рабочего стола для всех установленных приложений хранятся внутри /usr/share/applications каталог, в котором имена файлов представлены в формате application-name.desktop.Удаление .desktop часть из имен файлов даст вам общий список установленных приложений.
Обновление:
Как предложил @Radu, вы также можете найти записи рабочего стола для ваших дополнительных установленных приложений внутри ~/.local/share/applications каталог.
Не уверен, почему большинство опубликованных ответов связано с извлечением имени файла .ярлыки на рабочем столе. Имя файла ярлыка .desktop может быть любым, но важно то, что Name поле внутри файла ярлыка. Если вы хотите создать список имен установленных приложений, отображаемых в Dash, просто "grep" это поле в разделе [Desktop Entry]
Элементарный код с помощью bash
#!/bin/bashfor file in /usr/share/applications/*.desktop;do while IFS== read -r key val do if [[ -z $key ]]; then continue else if [[ $key =~ ^\[Desktop\ Entry ]]; then interesting_field=1 elif [[ $key =~ ^\[ ]]; then interesting_field=0 fi fi [[ $interesting_field -eq 1 ]] && [[ $key == "Name" ]] && echo $val done < $filedone
Но это не учитывает ярлыки, которые скрыты от отображения в Dash. Кто-то, кто лучше разбирается в спецификации .desktop, возможно, захочет еще больше расширить этот код, чтобы исключить такие ярлыки
Редактировать: еще одна попытка, с помощью Python
#!/usr/bin/pythonfrom os import listdirfrom os.path import isfile, joinimport ConfigParserSHORTCUTDIR = "/usr/share/applications/"shortcuts = [ file for file in listdir(SHORTCUTDIR) if isfile(join(SHORTCUTDIR, file)) and file.endswith(".desktop") ]dash_shortcuts = []for f in shortcuts: c = ConfigParser.SafeConfigParser() c.read(SHORTCUTDIR + f) try: if c.getboolean('Desktop Entry', 'NoDisplay') is True: continue except ConfigParser.NoOptionError: pass try: if "unity" in c.get('Desktop Entry', 'NotShowIn').lower(): continue except ConfigParser.NoOptionError: pass try: if "unity" not in c.get('Desktop Entry', 'OnlyShowIn').lower(): continue except ConfigParser.NoOptionError: pass dash_shortcuts += [ c.get("Desktop Entry", "Name") ]for s in sorted(dash_shortcuts, key=str.lower): print s
Если вам нужен список приложений, отображаемых при нажатии Super+A, вы можете использовать ls /usr/share/applications Единственное, что вам следует сделать, это заменить .desktop окончание которого является довольно простой задачей. Я делаю это с sed:
ls /usr/share/applications | sed s/.desktop// - > installed-apps.txt
Но вы можете сделать это после получения списка с помощью текстового редактора.
Спрашивающий хочет перечислить имена всех установленных "приложений".
Что касается приложений с .файлы рабочего стола:
ответ Данателы имеет дело с приложениями, которые имеют файлы .desktop в /usr/share/applications
как на что указал Раду, приложения с .файлы рабочего стола также можно найти в ~/.local/share/applications
на этом этапе можно отметить, что приложения с .файлы рабочего стола могут иметь два имена
одно "имя" доступно путем запроса Тире в Unity или из меню в Xubuntu (например). Это название происходит от Name= строка в соответствующем файле .desktop. Одним из примеров является "Карта символов".
другое "имя" - это то, которое будет использоваться при запуске приложения из терминала, и является первым словом после Exec=. В случае "Карты символов" это было бы gucharmap.
sed -ns '1F;/^\[Desktop Entry\]/,/^\[/{/^Name=/p;/^Exec=/h};${z;x;G;p}' /usr/share/applications/*.desktop
и
sed -ns '1F;/^\[Desktop Entry\]/,/^\[/{/^Name=/p;/^Exec=/h};${z;x;G;p}' $HOME/.local/share/applications/*.desktop
Что касается приложений без .файлы рабочего стола:
В зависимости от того, как определяется "приложение", у некоторых нет файлов .desktop.
было бы что-то вроде conky, poppler-utils, qpdf, xdotool и wmctrl будут считаться "приложениями"? Как их идентифицировать и перечислить по их именам (при условии, что кто-то их установил)?
Что о awk, find, grep, ls и sed назвать еще несколько? Являются ли они приложениями или нет?