如何列出我系统中安装的所有应用程序?

我知道,我只需要按下Super+A就可以看到在Ubuntu中安装的所有应用程序,但是我需要一个命令来列出它们的名称。这个命令是:
dpkg --get-selections | awk '{print $1}'

也不是一个选择,因为它显示了所有已安装的软件包,并且包含驱动程序、内核和库。

6个回答

我为那些想要更好地使用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

要获取您安装的所有应用程序及其名称的列表,最简单的方法是执行以下操作:
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 文件中出现的非 GUI 应用程序。

我不能同意对这个问题的回答。回答很好,但不适合在这个地方。很明显OP想要一个可以在Dash中找到的应用程序列表。而zshzsh-common和其他应用程序都不适合! - Radu Rădeanu
@RaduRădeanu 我刚刚使用了tail命令来显示我安装的软件包的摘录,它们以字母z结尾。如果我使用head命令,它们将以字母a开头。2)他想要在“dash”中列出应用程序吗?你确定吗? - Braiam
Braiam,来吧,这不是关于以z开头还是以a开头的问题... 当你在键盘上按下Super+A时,你能看到从屏幕左上角开始出现什么? - Radu Rădeanu
@RaduRădeanu 我经常使用GNOME3,因此我频繁地使用应用程序。 - Braiam
非常好 - GNOME3。但是OP看到的是已安装的应用程序,而不是常用的应用程序,所以他没有使用GNOME3,我猜他是使用默认的Unity桌面环境。如果你有疑问,可以在评论中问他。 - Radu Rădeanu
@RaduRădeanu 你对OP做了太多的假设。他想要看到所有已安装的应用程序,包括我的,全部列出来。 - Braiam
1@RaduRădeanu OP的标题说他想列出系统中安装的所有应用程序,不包括库、驱动程序、内核和其他内容。他提到了一种获取应用程序列表的方法(他使用的方法),即使用Super + A,这只显示系统中安装的应用程序的子集;但这已经涵盖了大部分,如果不是全部的话..答案将更完整,去掉--no-gui即可。 - rusty
1我撤回“--no-gui”那部分,看起来它不是我以为的那样。 - rusty

运行以下命令以查看所有已安装的应用程序:
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 \;

5ls命令不应该被解析。 - Radu Rădeanu
谢谢Radu,不过你见过包含换行符的文件名有多少次?从来没有?我也是这么想的。所以,因为一个几乎从不发生的极端情况,我就永远不应该使用非常有用的东西吗?我想我还是会继续解析ls——出于表征目的和非关键任务的考虑,并试着记住这个限制。谢谢你的提醒! - Rolf

不确定为什么大多数回答都涉及提取.desktop快捷方式的文件名。您的.desktop快捷方式文件名可以是任何内容,但重要的是快捷方式文件内部的“Name”字段。如果您想构建显示在Dash中的已安装应用程序名称列表,只需在“[Desktop Entry]”下使用“grep”该字段。
简单的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你应该真正扩展你的回答,使其更像一个完整的回答。 - Seth
@Seth 我发帖太早了,抱歉。我正在思考如何使用bash解析ini文件的问题,令我有些困惑。 - Flint
@AvinashRaj 我希望事情能这么简单,但这并不是解析ini文件的正确方式。如果你要解析的.desktop文件中有多个Name条目,代码将会出错并抛出异常,而这种情况往往是存在的。另外,你也不能假设所有你感兴趣的行都会出现在固定的行号上。 - Flint
@AvinashRaj 还是不太好 :P 你没有考虑到 Name 选项可能在行号的范围之外,尤其是在 [Desktop\ Entry ] 下面有很多选项或者空行的情况。而且 .desktop 文件就是一个 ini 文件 - Flint

如果你需要在按下Super+A时显示应用程序列表,你可以使用ls /usr/share/applications命令。你唯一需要做的是替换掉.desktop后缀,这是一个非常简单的任务。我会使用sed来完成它。
ls /usr/share/applications | sed s/.desktop// - > installed-apps.txt

但是您可以在收到列表后使用文本编辑器进行操作。


5ls命令永远不应该被解析。 - Radu Rădeanu
2@Radu,实际上,/usr/share/application/*.desktop文件不包含任何特殊字符,所以在这种情况下允许解析ls命令。 - Danatela
当你按下Super+A时,这并不列出所有显示的应用程序。 - Radu Rădeanu
4@Semi-bit 你假设一切都没有出错。如果我是个白痴,例如创建了一个名为 bad name.desktop 的文件呢?这里没有必要冒险使用 ls 命令。 - terdon

问题提问者想要列出所有已安装的“应用程序”的名称。
关于具有.desktop文件的应用程序:
  • Danatela的回答处理了在/usr/share/applications中具有.desktop文件的应用程序。
  • 正如Radu指出的那样,具有.desktop文件的应用程序也可以在~/.local/share/applications中找到。
  • 此时,可以注意到具有.desktop文件的应用程序可以有两个名称
    • 一个“名称”可以通过在Unity的Dash或Xubuntu的菜单中查询获得。这个名称是从相应的.desktop文件中的Name=行派生而来。一个例子是“字符映射”。
    • 另一个“名称”是在终端中运行应用程序时要使用的名称,它是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命令以列出所有可用的命令和别名此答案将有助于识别它们。