![列出应用程序菜单中出现的所有桌面文件](https://linux22.com/image/105255/%E5%88%97%E5%87%BA%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E8%8F%9C%E5%8D%95%E4%B8%AD%E5%87%BA%E7%8E%B0%E7%9A%84%E6%89%80%E6%9C%89%E6%A1%8C%E9%9D%A2%E6%96%87%E4%BB%B6.png)
语境
我正在使用 GNOME 3.22,我想将所有桌面文件分组。为此,我必须列出应用程序菜单中出现的所有桌面文件,并使用以下命令本指南来组织他们。
我发现有 3 个地方包含这些桌面文件:
~/.local/share/applications
~/.local/share/flatpak/exports/share/applications
/usr/share/applications
使用这个脚本,我成功了一半。但是,仍然有一些项目不属于任何组:
这些桌面文件没有任何
Categories
字段,因此我无法按类别统治它们这些桌面文件不属于我上面列出的任何目录,因此我无法调用它们的名称
问题
显然,GNOME 不仅仅列出上面目录中的桌面文件。必须有某个地方存储它们,桌面 shell 只需读取它即可列出所有应用程序。我只是看不到它。你能告诉我它在哪里吗?
更新
答案1
Gio
您可以使用该库(Gnome 构建于其上的 Gtk/GObject/GLib 生态系统的一部分),而不是自己搜索文件系统。您可以通过 Python 在任何基于 Gtk 的桌面环境(例如 Gnome、Xfce、MATE、Cinnamon 等)上使用它。带gi
模块的 Python 应该可用,无需安装任何东西。
from gi.repository import Gio
all_apps = Gio.AppInfo.get_all() # Returns a list of DesktopAppInfo objects (see docs)
# For example, print display name and description of all apps
for app in all_apps:
print(app.get_display_name())
print(f"\t{app.get_description()}")
API文档:Gio.AppInfo,Gio.DesktopAppInfo
DesktopAppInfo
继承自AppInfo
.我还没有找到AppInfo
可能还有哪些其他类型。返回的对象Gio.AppInfo.get_all
似乎都是Gio.DesktopAppInfo
实例。据我所知,我们主要是在处理DesktopAppInfo
实例。
这些DesktopAppInfo
对象代表它在您的系统上找到的所有 .desktop 文件。它们具有可以使用get_
* 方法访问的属性,几乎代表 .desktop 文件中的所有内容。
您可以获取AppInfo
对象的属性,例如name
,display_name
(通常与名称相同,但有时不同),commandline
(带有调用以运行应用程序的参数的完整命令行),executable
(仅命令,无参数)description
等。请参阅get_*
方法在 API 文档中,从Gio.AppInfo.get_commandline在。
以及DesktopAppInfo
中的所有内容AppInfo
,再加上:categories
、generic_name
、keywords
、startup_wm_class
等。参见Gio.DesktopAppInfo.get_action_name向前
答案2
应用程序菜单搜索路径的免费桌面规范是这里。您的问题的简短答案是将“应用程序”附加到搜索路径 $XDG_DATA_DIRS 中的每个目录。
答案3
此链接可能有助于处理没有任何“类别”字段的桌面文件: https://wiki.gentoo.org/wiki/Gnome_Applications_Folders
答案4
我知道我参加聚会迟到了,但也许这个答案对后来的人有帮助。
要查找系统中的所有桌面文件:
find / -iname "*desktop" -type f -not -path "/media*" 2> /dev/null
上面的命令列出了系统中的所有桌面文件。如果您想查找特定应用程序(替换<application-name>
为您的应用程序名称甚至其名称的一部分,并删除<>
):
find / -iname "*desktop" -type f -not -path "/media*" -exec grep -il <application-name> '{}' ';' 2> /dev/null
希望有一天这可以帮助别人。