Como posso listar todos os aplicativos instalados no meu sistema?

18

Eu sei, só posso clicar em Super+ Apara ver todos os aplicativos instalados no Ubuntu, mas preciso de um comando para listar seus nomes. O comando

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

também não é uma opção porque mostra todos os pacotes instalados e contém drivers, kernels e bibliotecas.

Danatela
fonte

Respostas:

17

Eu vim com esta resposta para pessoas que querem usar o bash de uma maneira boa. É claro que a resposta da pergunta está relacionada à listagem dos arquivos /usr/share/applications, mas o problema é que o lscomando nunca deve ser analisado . No passado, eu estava cometendo o mesmo erro, mas agora aprendi que a melhor maneira é usar um forloop para iterar nos arquivos, mesmo que eu precise usar mais algumas teclas do meu precioso teclado:

for app in /usr/share/applications/*.desktop; do echo "${app:24:-8}"; done

Eu também usei nas operações de manipulação de cadeia de comando anteriores : removidas dos appprimeiros 24 caracteres que são /usr/share/applications/e dos últimos 8 caracteres que são .desktop.


Atualizar:

Outro local onde você pode encontrar aplicativos mostrados pelo Dash é ~/.local/share/applications/*.desktop. Portanto, você também precisa executar o seguinte comando:

for app in ~/.local/share/applications/*.desktop; do echo "${app:37:-8}"; done

Para unificar os dois comandos anteriores, você pode usar:

for app in /usr/share/applications/*.desktop ~/.local/share/applications/*.desktop; do app="${app##/*/}"; echo "${app::-8}"; done
Radu Rădeanu
fonte
4

Para obter a lista de todos os aplicativos instalados com seus nomes, a maneira mais fácil é:

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

Ele fornecerá uma boa lista de todos os pacotes instalados que não são bibliotecas, nem kernels, nem pacotes de desenvolvimento como este:

* 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 

É mais completo, pois também lista aplicativos não GUI que não aparecerão nos .desktoparquivos

Braiam
fonte
Não posso concordar com esta resposta a esta pergunta. A resposta é boa, mas não neste lugar. É claro o suficiente que o OP deseja uma lista com aplicativos que podem ser encontrados no Dash. E não há lugar para zsh, zsh-commone outros!
Radu Rădeanu 16/03/14
@ RaduRădeanu Acabei de usar o tail para mostrar um trecho dos meus pacotes instalados, que termina com z, se eu tivesse usado o head, eles começarão com a, 2) ele deseja aplicativos listados no "traço"? Você tem certeza?
Braiam
Braiam, vamos lá, não se trata de qual é o início com z ou com ... Quando você pressiona Super + A no teclado, o que você vê na tela a partir do canto superior esquerdo?
Radu Rădeanu 16/03/14
1
O título do @ RaduRădeanu OP diz que ele deseja listar todos os aplicativos instalados em seu sistema, excluindo bibliotecas, drivers, kernels e outros. Ele menciona uma das maneiras (que ele usa) para obter a lista de aplicativos, que usa Super + A e isso apenas exibe um subconjunto dos aplicativos instalados no sistema; mas isso cobre a maioria, senão todas ... a resposta seria completa mesmo com a --no-guiremoção.
precisa
1
..Eu retiro o --no-guipapel, parece que não existe para o que eu pensava que era.
precisa
3

Execute o comando abaixo para ver todos os aplicativos instalados,

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

Se você deseja obter a lista de todos os aplicativos instalados, execute o comando abaixo,

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

Ele armazenará a saída do comando acima para applications.txtarquivar dentro do seu ~/Desktopdiretório.

OU

Execute também o comando abaixo no terminal para listar os aplicativos instalados,

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

Para obter a lista no arquivo de texto, execute o comando abaixo

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

As entradas da área de trabalho para todos os aplicativos instalados são armazenadas dentro do /usr/share/applicationsdiretório, onde os nomes dos arquivos estão no formato application-name.desktop.Remover a .desktopparte dos nomes dos arquivos fornecerá a lista total de aplicativos instalados.

Atualizar:

Como o @Radu sugeriu , você também pode encontrar entradas da área de trabalho para seus aplicativos instalados adicionais dentro do ~/.local/share/applicationsdiretório.

find /usr/share/applications ~/.local/share/applications -maxdepth 1 -type f -exec basename {} .desktop \;
Avinash Raj
fonte
5
lscomando nunca deve ser analisado !
Radu Rădeanu 13/03
Obrigado Radu, no entanto, quantas vezes você viu um nome de arquivo contendo uma nova linha? Nunca? Pensei isso . Então, eu nunca deveria usar algo muito útil por causa de um caso que praticamente nunca acontece? Acho que continuarei analisando ls- para fins de representação e para tarefas não críticas, como a acima - e tentarei ter em mente essa limitação, obrigado pelo aviso!
Rolf
0

Se você precisar da lista de aplicativos mostrados ao pressionar Super+ A, poderá usar ls /usr/share/applications. A única coisa que você deve fazer é substituir o .desktopfinal, que é uma tarefa bastante simples. Eu faço isso com sed:

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

Mas você pode fazer isso depois de receber a lista usando o editor de texto.

Danatela
fonte
5
lscomando nunca deve ser analisado !
Radu Rădeanu 13/03
2
@Radu, na verdade, os /usr/share/application/*.desktoparquivos não contêm caracteres especiais, portanto, a análise lsparticularmente nesse caso é permitida.
Danatela 14/03
Isso não lista todos os aplicativos mostrados quando você pressiona Super + A.
Radu Rădeanu 16/03/14
4
@ Semi-bit, você está assumindo que nada deu errado. E se eu for um idiota e tiver criado um arquivo chamado, bad name.desktoppor exemplo? Não há razão para arriscar lsaqui.
terdon
0

Não sei por que a maioria das respostas postadas envolve a extração do nome do arquivo dos atalhos do .desktop. O nome do arquivo do atalho .desktop pode ser qualquer coisa, menos o que importa é o Namecampo dentro do arquivo de atalho. Se você deseja criar a lista de nomes de aplicativos instalados exibidos no Dash, basta "grep" nesse campo em[Desktop Entry]

Código rudimentar, com 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

Mas isso não leva em conta os atalhos ocultos da exibição no Dash. Alguém com uma melhor compreensão das especificações do .desktop pode querer expandir ainda mais esse código para excluir esses tipos de atalhos

Edit: outra tentativa, com 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
pedra
fonte
3
Você realmente deve expandir sua resposta para ser mais uma resposta.
Seth
@ Set eu postei muito cedo, desculpe. Fui coçar a cabeça para descobrir como analisar ini com o bash
Flint
@AvinashRaj Eu gostaria que fosse simples assim, mas que não seja a maneira correta de analisar ini. O código explodirá e emitirá ruídos se houver mais de uma Nameentrada no .desktop que você está analisando, o que sempre acontece. Além disso, você não deve assumir que todas as linhas com as quais você está interessado estarão no número fixo da linha
Flint
@AvinashRaj Ainda ruim: P Você não levou em consideração que a Nameopção poderia estar fora desse intervalo de número de linha, especialmente com muitas opções ou linhas em branco abaixo [Desktop\ Entry ]. E arquivo .desktop é uma ini
Flint
0

O interlocutor deseja listar os nomes de todos os "aplicativos" instalados.

Em relação aos aplicativos com arquivos .desktop :

  • a resposta de Danatela lida com aplicativos que possuem arquivos .desktop em/usr/share/applications
  • como apontado por Radu , aplicativos com arquivos .desktop também podem ser encontrados em~/.local/share/applications
  • Neste ponto, pode-se notar que aplicativos com arquivos .desktop podem ter dois nomes
    • um "nome" está disponível consultando o Dash no Unity ou nos menus no Xubuntu (por exemplo). Esse nome é derivado da Name=linha no respectivo arquivo .desktop. Um exemplo é "Mapa de caracteres".
    • o outro "nome" é aquele a ser usado ao executar o aplicativo a partir do terminal e é a primeira palavra depois Exec=. No caso de "Mapa de Caracteres", seria gucharmap.
  • os dois nomes (e o arquivo .desktop) podem estar relacionados usando:
    • sed -ns '1F;/^\[Desktop Entry\]/,/^\[/{/^Name=/p;/^Exec=/h};${z;x;G;p}' /usr/share/applications/*.desktop
    • e
    • sed -ns '1F;/^\[Desktop Entry\]/,/^\[/{/^Name=/p;/^Exec=/h};${z;x;G;p}' $HOME/.local/share/applications/*.desktop

Em relação aos aplicativos sem arquivos .desktop :

Dependendo de como se define "aplicativo", alguns não têm arquivos .desktop.

  • Seria algo como conky, poppler-utils, qpdf, xdotoole wmctrlser considerados "apps"? Como eles devem ser identificados e listados por seus nomes (supondo que alguém os tenha instalado)?
  • Que tal awk, find, grep, lse sedpara citar um pouco mais? Eles são aplicativos ou não são?

Se algo que possui um comando é considerado um aplicativo, o comando Linux para listar todos os comandos e aliases disponíveis e essa resposta ajudará a identificá-los.

DK Bose
fonte