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


18

我知道,我可以按Super+ A来查看Ubuntu中所有已安装的应用程序,但是我需要一个命令来列出其名称。命令

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

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

Answers:


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文件中的非GUI应用程序,因此它更加完整。


我不同意这个问题的答案。答案很好,但不是在这个地方。很清楚,OP需要一个列表,其中包含可以在Dash中找到的应用程序。并没有到位zshzsh-common他人和!
RaduRădeanu2014年

@RaduRădeanu我只是用tail来显示我安装的软件包的摘录,以z结尾,如果使用过head,它们将以a开头,2)他希望应用程序在“破折号”中列出吗?你确定吗?
Braiam 2014年

Braiam,来了,这与z或a开头无关。当您按键盘上的Super + A时,您会看到从左上角开始出现在屏幕上的内容吗?
RaduRădeanu2014年

1
@RaduRădeanuOP的标题表示,他想列出系统中安装的所有应用程序,但不包括库,驱动程序,内核和其他。.他提到了一种(他使用的)获取应用程序列表的方法,即Super +A。并且仅显示系统中安装的应用程序的子集;但这涵盖了大多数(如果不是全部).. --no-gui删除后答案甚至是完整的。
2014年

1
..我收回了那--no-gui部分,似乎它不存在我认为的样子。
2014年

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 \;


感谢Radu,但是您看到多少次包含换行符的文件名了?决不?是这么认为的 。所以我永远都不要使用非常有用的东西,因为几乎不会发生边缘情况?我想我会继续解析ls-为了表示目的,并为非关键性任务(例如上述任务)-并请记住这一限制,谢谢您的注意!
罗尔夫

0

如果需要按Super+ 时显示的应用程序列表A,则可以使用ls /usr/share/applications。您唯一要做的就是替换.desktop结尾,这是非常简单的任务。我这样做sed

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

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



2
@Radu,实际上,/usr/share/application/*.desktop文件不包含任何特殊字符,因此ls特别允许在这种情况下进行解析。
Danatela

当您点击Super + A时,不会列出所有显示的应用程序。
RaduRădeanu2014年

4
@ Semi-bit,您假设没有任何问题。如果我是个白痴并且创建了一个名为bad name.desktop例如的文件怎么办?这里没有理由冒险ls
terdon 2014年

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
您应该真正将答案扩展为更多答案。
塞斯(Seth)2014年

@Seth我发布得太早了,对不起。我正在摸索弄清楚如何用bash解析ini
Flint 2014年

@AvinashRaj我希望它是如此简单,但这不是解析ini的正确方法。如果Name要解析的.desktop中有多个条目,则该代码将爆炸并引发噪音,这种情况总是如此。同样,您不应该假设所有感兴趣的行都位于固定行号上
Flint 2014年

@AvinashRaj仍然很糟糕:P您没有考虑到Name选项可能超出该行号范围,尤其是对于很多选项或之下的空白行[Desktop\ Entry ]。.desktop文件是一个ini文件
Flint 2014年

0

发问者想列出所有已安装“应用程序”的名称。

关于带有.desktop文件的应用程序

  • Danatela的答案涉及的应用程序中包含.desktop文件/usr/share/applications
  • 正如Radu指出的,带有.desktop文件的应用程序也可以在~/.local/share/applications
  • 在这一点上,可能会注意到带有.desktop文件的应用可以有两个名称
    • 可通过查询Unity中的Dash或从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文件,具体取决于一个人定义“ app”的方式。

  • 就有点像conkypoppler-utilsqpdfxdotoolwmctrl被认为是“应用程序”?如何识别它们并按其名称列出(假设已安装它们)?
  • 怎么样awkfindgreplssed命名一些吗?他们是应用程序还是不是?

如果任何具有命令的内容都被认为是应用程序,那么Linux命令会列出所有可用的命令和别名那里的答案将有助于识别它们。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.