Jak mogę wyświetlić listę wszystkich aplikacji zainstalowanych w moim systemie?

18

Wiem, po prostu mogę nacisnąć Super+, Aaby zobaczyć wszystkie zainstalowane aplikacje w Ubuntu, ale potrzebuję polecenia, aby wyświetlić ich nazwy. Komenda

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

nie jest również opcją, ponieważ pokazuje wszystkie zainstalowane pakiety i zawiera sterowniki, jądra i biblioteki.

Danatela
źródło

Odpowiedzi:

17

Wymyśliłem tę odpowiedź dla osób, które chcą dobrze wykorzystać bash. Oczywiste jest, że odpowiedź na pytanie dotyczy listy plików /usr/share/applications, ale problem polega na tym, że lskomendy nie należy nigdy analizować . W przeszłości popełniłem ten sam błąd, ale teraz dowiedziałem się, że najlepszym sposobem jest użycie forpętli do iteracji plików, nawet jeśli muszę użyć więcej klawiszy z mojej cennej klawiatury:

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

Użyłem również w poprzednich operacjach ciągów poleceń : usunięto z apppierwszych 24 znaków, które są, /usr/share/applications/i ostatnich 8 znaków, które są .desktop.


Aktualizacja:

Innym miejscem, w którym można znaleźć aplikacje pokazane przez Dash, jest ~/.local/share/applications/*.desktop. Musisz więc również uruchomić następujące polecenie:

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

Aby ujednolicić poprzednie dwa polecenia, możesz użyć:

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

Aby uzyskać listę wszystkich zainstalowanych aplikacji wraz z ich nazwami, najprostszym sposobem jest:

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

Otrzymasz ładną listę wszystkich zainstalowanych pakietów, które nie są bibliotekami, nie jądrami, ani pakietem programistycznym, takim jak ten:

* 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 

Jest bardziej kompletny, ponieważ zawiera listę aplikacji innych niż GUI, które nie pojawią się w .desktopplikach

Braiam
źródło
Nie mogę się zgodzić z tą odpowiedzią na to pytanie. Odpowiedź jest miła, ale nie w tym miejscu. Jest wystarczająco jasne, że OP chce listy z aplikacjami, które można znaleźć w Dash. I nie jest miejsce dla zsh, zsh-commoni inni!
Radu Rădeanu
@ RaduRădeanu Właśnie użyłem taila, aby pokazać fragment moich zainstalowanych pakietów, który kończy się na z, jeśli użyłem head, zaczną od, 2) chce aplikacji wymienionych w „desce rozdzielczej”? Jesteś pewny?
Braiam
Braiam, no dalej, nie chodzi o to, od czego zacząć od z czy od ... Kiedy naciskasz Super + A na klawiaturze, co widzisz na ekranie, zaczynając od lewego górnego rogu?
Radu Rădeanu
1
@ RaduRădeanu Tytuł OP mówi, że chce wyświetlić listę wszystkich aplikacji zainstalowanych w jego systemie, z wyjątkiem bibliotek, sterowników, jąder i innych .. Wspomina o jednym ze sposobów (z którego korzysta), aby uzyskać listę aplikacji, która używa Super + A i to tylko wyświetla podzbiór aplikacji zainstalowanych w systemie; ale obejmuje to większość, jeśli nie wszystkie ... odpowiedź byłaby nawet pełna po --no-guiusunięciu.
dokładnie
1
.. Cofam tę --no-guiczęść, wygląda na to, że nie ma tego, co myślałem.
dokładnie
3

Uruchom poniższe polecenie, aby zobaczyć wszystkie zainstalowane aplikacje,

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

Jeśli chcesz uzyskać listę wszystkich zainstalowanych aplikacji, uruchom poniższe polecenie,

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

Będzie przechowywać powyższe dane wyjściowe polecenia do applications.txtpliku w ~/Desktopkatalogu.

LUB

Uruchom także poniższe polecenie na terminalu, aby wyświetlić listę zainstalowanych aplikacji,

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

Aby uzyskać listę w pliku tekstowym, uruchom poniższe polecenie

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

Wpisy na pulpicie dla wszystkich zainstalowanych aplikacji są przechowywane w /usr/share/applicationskatalogu, w którym nazwy plików mają format. application-name.desktopUsunięcie .desktopczęści z nazw plików daje całkowitą listę zainstalowanych aplikacji.

Aktualizacja:

Jak sugeruje @Radu , w ~/.local/share/applicationskatalogu można również znaleźć wpisy pulpitu dla dodatkowych zainstalowanych aplikacji .

find /usr/share/applications ~/.local/share/applications -maxdepth 1 -type f -exec basename {} .desktop \;
Avinash Raj
źródło
Dzięki Radu, ile razy widziałeś nazwę pliku zawierającą nowy wiersz? Nigdy? Tak myślałem . Więc nigdy nie powinienem nigdy używać czegoś bardzo przydatnego z powodu przypadku, który praktycznie nigdy się nie zdarza? Myślę, że będę dalej analizować ls- do celów reprezentacyjnych i do niekrytycznych zadań, takich jak powyższe - i postaram się pamiętać o tym ograniczeniu, dziękuję za uwagi!
Rolf
0

Jeśli potrzebujesz listy aplikacji wyświetlanej po naciśnięciu Super+ A, możesz użyć ls /usr/share/applications. Jedyne, co powinieneś zrobić, to zastąpić .desktopzakończenie, co jest dość prostym zadaniem. Robię to z sed:

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

Ale możesz to zrobić po otrzymaniu listy za pomocą edytora tekstu.

Danatela
źródło
2
@Radu, w rzeczywistości, /usr/share/application/*.desktoppliki nie zawierają żadnych znaków specjalnych, więc parsowanie, lsszczególnie w tym przypadku, jest dozwolone.
Danatela
Nie wyświetla to wszystkich aplikacji wyświetlanych po naciśnięciu Super + A.
Radu Rădeanu
4
@ Semi-bit zakładasz, że nic nie poszło nie tak. Co jeśli jestem idiotą i utworzyłem plik o nazwie bad name.desktopna przykład? Nie ma powodu, aby ryzykować lstutaj.
terdon
0

Nie jestem pewien, dlaczego większość opublikowanych odpowiedzi obejmuje wyodrębnienie nazwy pliku skrótów .desktop. Nazwa pliku skrótu .desktop może być dowolna, ale ważne jest Namepole wewnątrz pliku skrótu. Jeśli chcesz zbudować listę zainstalowanych aplikacji wyświetlanych w Dash, po prostu „grep” w tym polu[Desktop Entry]

Podstawowy kod, z 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

Ale to nie uwzględnia skrótów, które są ukryte przed wyświetleniem w Dash. Ktoś, kto lepiej rozumie specyfikację .desktop, może chcieć rozszerzyć ten kod, aby wykluczyć tego rodzaju skróty

Edycja: kolejna próba z Pythonem

#!/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
Krzemień
źródło
3
Naprawdę powinieneś rozszerzyć swoją odpowiedź, aby była bardziej odpowiedzią.
Seth
@Seth Przepraszam, opublikowałem zbyt wcześnie. Drapałem się w głowie, zastanawiając się, jak parsować ini bash
Flint
@AvinashRaj Chciałbym, żeby to było takie proste, ale nie jest to właściwy sposób na parsowanie ini. Kod eksploduje i będzie wydawał dźwięki, jeśli Namew analizatorze znajduje się więcej niż jeden wpis, co zawsze ma miejsce. Nie należy również zakładać, że wszystkie linie, którymi jesteś zainteresowany, będą na stałym numerze linii
Flint
@AvinashRaj Nadal źle: P Nie wziąłeś pod uwagę, że Nameopcja może znajdować się poza tym zakresem numeru linii, szczególnie przy wielu opcjach lub pustych liniach poniżej [Desktop\ Entry ]. Plik .desktop to plik ini
Flint
0

Pytający chce wymienić nazwy wszystkich zainstalowanych „aplikacji”.

W przypadku aplikacji z plikami .desktop :

  • odpowiedź Danatela dotyczy aplikacji, w których znajdują się pliki .desktop/usr/share/applications
  • jak wskazał Radu , aplikacje z plikami .desktop można również znaleźć w~/.local/share/applications
  • w tym miejscu można zauważyć, że aplikacje z plikami .desktop mogą mieć dwie nazwy
    • jedna „nazwa” jest dostępna poprzez zapytanie do Dasha w Unity lub z menu w Xubuntu (na przykład). Ta nazwa pochodzi od Name=wiersza w odpowiednim pliku .desktop. Jednym z przykładów jest „Mapa postaci”.
    • druga „nazwa” jest używana podczas uruchamiania aplikacji z terminala i jest pierwszym słowem po Exec=. W przypadku „mapy postaci” byłoby to gucharmap.
  • dwie nazwy (i plik .desktop) można za pomocą:
    • sed -ns '1F;/^\[Desktop Entry\]/,/^\[/{/^Name=/p;/^Exec=/h};${z;x;G;p}' /usr/share/applications/*.desktop
    • i
    • sed -ns '1F;/^\[Desktop Entry\]/,/^\[/{/^Name=/p;/^Exec=/h};${z;x;G;p}' $HOME/.local/share/applications/*.desktop

Jeśli chodzi o aplikacje bez plików .desktop :

W zależności od tego, jak zdefiniowano „aplikację”, niektóre nie mają plików .desktop.

  • Byłoby coś conky, poppler-utils,qpdf , xdotooli wmctrluznać za „aplikacje”? Jak można je zidentyfikować i wymienić według ich nazw (zakładając, że ktoś je zainstalował)?
  • Co awk, find, grep, lsised aby wymienić kilka? Czy to aplikacje, czy nie?

Jeśli cokolwiek , co ma polecenie, jest uważane za aplikację, to polecenie Linuksa wyświetla listę wszystkich dostępnych poleceń i aliasów, a ta odpowiedź tam pomoże je zidentyfikować.

DK Bose
źródło