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

18

Я знаю, я просто могу нажать Super+, Aчтобы увидеть все установленные приложения в Ubuntu, но мне нужна команда, чтобы перечислить их имена. Команда

dpkg --get-selections | awk '{print $1}'

также не вариант, потому что он показывает все установленные пакеты и содержит драйверы, ядра и библиотеки.

Danatela
источник

Ответы:

17

Я придумал этот ответ для людей, которые хотят правильно использовать 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.


Обновить:

Другое место, где вы можете найти приложения, показанные Dash, это ~/.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
Раду Рэдяну
источник
4

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

sudo apt-get install aptitude
aptitude -F' * %p -> %d ' --no-gui --disable-columns search '?and(~i,!?section(libs), !?section(kernel), !?section(devel))'

Это даст вам хороший список всех установленных пакетов, которые не являются библиотеками, не ядрами, не пакетами разработки, как это:

* zip -> Archiver for .zip files 
* zlib1g -> compression library - runtime 
* zlib1g-dev -> compression library - development 
* zsh -> shell with lots of features 
* zsh-common -> architecture independent files for Zsh 

Он более полон, поскольку в нем также перечислены приложения без графического интерфейса, которые не будут отображаться в .desktopфайлах.

Braiam
источник
Я не могу согласиться с этим ответом на этот вопрос. Ответ хорош, но не в этом месте. Достаточно ясно, что ОП хочет список с приложениями, которые можно найти в Dash. И там не место zsh, zsh-commonи другие!
Раду Рэдяну
@ RaduRădeanu Я только что использовал tail, чтобы показать отрывок из моих установленных пакетов, который заканчивается на z, если я использовал head, они начнутся с a, 2) он хочет, чтобы приложения были перечислены в «dash»? Вы уверены?
Брайам
Брайам, давай, дело не в том, что начинать с z или с ... Когда ты нажимаешь Super + A на своей клавиатуре, что ты видишь на экране, начиная с верхнего левого угла?
Раду Рэдяну
1
В заголовке @ RaduRădeanu OP говорится, что он хочет перечислить все приложения, установленные в его системе, за исключением библиотек, драйверов, ядер и других. Он упоминает один из способов (который он использует), чтобы получить список приложений, который использует Super + A и это просто отображает подмножество приложений, установленных в системе; но это охватывает большинство, если не все .. ответ будет даже полным с --no-guiудаленным.
точный
1
Я забираю --no-guiчасть, кажется, ее там нет, как я и думал.
точное
3

Запустите команду ниже, чтобы увидеть все установленные приложения,

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

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

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

Он сохранит вышеприведенный вывод команды в applications.txtфайл внутри вашего ~/Desktopкаталога.

ИЛИ

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

find /usr/share/applications -maxdepth 1 -type f -exec basename {} .desktop \; | sort

Чтобы получить список в текстовом файле, выполните команду ниже

find /usr/share/applications -maxdepth 1 -type f -exec basename {} .desktop \; | sort > ~/Desktop/applications.txt

Записи рабочего стола для всех установленных приложений хранятся в /usr/share/applicationsкаталоге, где имена файлов имеют формат. application-name.desktopУдаление .desktopчасти из имен файлов даст вам полный список установленных приложений.

Обновить:

Как предложил @Radu , вы также можете найти записи рабочего стола для ваших дополнительных установленных приложений внутри ~/.local/share/applicationsкаталога.

find /usr/share/applications ~/.local/share/applications -maxdepth 1 -type f -exec basename {} .desktop \;
Авинаш Радж
источник
Спасибо Раду, однако, сколько раз вы видели имя файла, содержащее перевод строки? Никогда? Так и думал . Поэтому я никогда не должен использовать что-то очень полезное из-за крайнего случая, который практически никогда не происходит? Я думаю, что я буду продолжать синтаксический анализ ls- для представительских целей и для некритических задач, таких как приведенная выше, - и постараюсь учесть это ограничение, спасибо за внимание!
Рольф
0

Если вам нужен список приложений, отображаемых при нажатии Super+ A, вы можете использовать ls /usr/share/applications. Единственное, что вам нужно сделать, это заменить .desktopокончание, что является довольно простой задачей. Я делаю это с sed:

ls /usr/share/applications | sed s/.desktop// - > installed-apps.txt

Но вы можете сделать это после того, как вы получили список с помощью текстового редактора.

Danatela
источник
2
@Radu, на самом деле, /usr/share/application/*.desktopфайлы не содержат никаких специальных символов, так что lsв этом случае анализ разрешен.
Данатела
Это не список всех приложений, отображаемых при нажатии Super + A.
Раду Рэдяну
4
@ Полубит, ты предполагаешь, что ничего не пошло не так. Что, если я идиот и создал файл с именем, bad name.desktopнапример? Здесь нет причин рисковать ls.
Тердон
0

Не уверен, почему большинство опубликованных ответов включает в себя извлечение имени файла ярлыков .desktop. Ваше имя файла ярлыка .desktop может быть любым, но имеет значение Nameполе внутри файла ярлыка. Если вы хотите построить список установленных имен приложений, отображаемых в Dash, просто "grep" это поле под[Desktop Entry]

Рудиментальный код, с bash

#!/bin/bash

for 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 < $file
done

Но это не учитывает ярлыки, которые скрыты от показа в Dash. Кто-то, кто лучше понимает спецификацию .desktop, может захотеть еще больше расширить этот код, чтобы исключить подобные ярлыки.

Изменить: еще одна попытка, с Python

#!/usr/bin/python

from os import listdir
from os.path import isfile, join
import ConfigParser

SHORTCUTDIR = "/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
кремень
источник
3
Вы должны действительно расширить свой ответ, чтобы быть больше ответа.
Сет
@ Сидит, я отправил слишком рано, извините. Я почесал голову, выясняя, как разобрать ini с помощью bash
Flint
@AvinashRaj Хотелось бы, чтобы это было так просто, но это неправильный способ разбора ini. Код будет взрываться и генерировать шумы, если Nameв .desktop есть несколько записей, которые вы анализируете, что всегда имеет место. Также не следует полагать, что все интересующие вас линии будут на фиксированном номере
Flint
@AvinashRaj Все еще плохо: P Вы не учли, что Nameопция может быть за пределами этого диапазона номера строки, особенно с большим количеством опций или пустых строк [Desktop\ Entry ]. И файл .desktop является INI-файлом
Flint
0

Спрашивающий хочет перечислить имена всех установленных «приложений».

Что касается приложений с файлами .desktop :

  • ответ Danatela касается приложений, которые имеют файлы .desktop в/usr/share/applications
  • как указывает Radu , приложения с файлами .desktop также можно найти в~/.local/share/applications
  • на этом этапе можно отметить, что приложения с файлами .desktop могут иметь два имени
    • одно «имя» можно получить, запросив Dash в Unity или из меню в Xubuntu (например). Это имя происходит от Name=строки в соответствующем файле .desktop. Одним из примеров является «Карта персонажей».
    • другое «имя» - это то, которое будет использоваться при запуске приложения из терминала, и это первое слово после Exec=. В случае с «картой персонажей» это будет gucharmap.
  • два имени (и файл .desktop) могут быть связаны с помощью:
    • 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 :

В зависимости от того, как кто-то определяет «приложение», у некоторых нет файлов .desktop.

  • Будет что - то вроде conky, poppler-utils, qpdf, xdotoolи wmctrlсчитаются «приложение»? Как их идентифицировать и перечислить по их именам (при условии, что кто-то их установил)?
  • А как насчет awk, find, grep, lsи sedназвать еще? Это приложения или нет?

Если что-либо , имеющее команду, рассматривается как приложение, то команда Linux для вывода списка всех доступных команд и псевдонимов и этого ответа поможет идентифицировать их.

Д. К. Бозе
источник