Answers:
我为想以良好方式使用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应用程序,因此它更加完整。
--no-gui
删除后答案甚至是完整的。
--no-gui
部分,似乎它不存在我认为的样子。
运行以下命令以查看所有已安装的应用程序,
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
-为了表示目的,并为非关键性任务(例如上述任务)-并请记住这一限制,谢谢您的注意!
如果需要按Super+ 时显示的应用程序列表A,则可以使用ls /usr/share/applications
。您唯一要做的就是替换.desktop
结尾,这是非常简单的任务。我这样做sed
:
ls /usr/share/applications | sed s/.desktop// - > installed-apps.txt
但是您可以在使用文本编辑器收到列表之后执行此操作。
/usr/share/application/*.desktop
文件不包含任何特殊字符,因此ls
特别允许在这种情况下进行解析。
bad name.desktop
例如的文件怎么办?这里没有理由冒险ls
。
不知道为什么大多数发布的答案都涉及提取.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
Name
要解析的.desktop中有多个条目,则该代码将爆炸并引发噪音,这种情况总是如此。同样,您不应该假设所有感兴趣的行都位于固定行号上
发问者想列出所有已安装“应用程序”的名称。
关于带有.desktop文件的应用程序:
/usr/share/applications
~/.local/share/applications
Name=
相应的.desktop文件中的行派生的。一个例子是“角色图”。Exec=
。在“角色地图”的情况下,该值为gucharmap
。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”的方式。
conky
,poppler-utils
,qpdf
, xdotool
和wmctrl
被认为是“应用程序”?如何识别它们并按其名称列出(假设已安装它们)?awk
,find
,grep
,ls
并sed
命名一些吗?他们是应用程序还是不是?如果任何具有命令的内容都被认为是应用程序,那么Linux命令会列出所有可用的命令和别名,那里的答案将有助于识别它们。
zsh
,zsh-common
他人和!