我怎样才能找到*.desktop文件?

据我所知,Unity启动器中的所有快捷方式都有相应的*.desktop文件。我有一个快捷方式(用于skrooge),但没有图标。我该如何找到与此快捷方式对应的*.desktop文件,以便我可以为其添加一个图标呢?
8个回答

它可能位于/usr/share/applications/,但如果你想找到系统上的每个.desktop文件,请运行以下命令:
find / -name '*.desktop'

或者

sudo updatedb
locate *.desktop

要查找路径或名称中包含“skrooge”的文件,请在命令中添加一个grep
locate *.desktop | grep -iR "skrooge"

34locate -i "*skrooge*.desktop"。虽然Unity主要会在三个地方查找桌面文件。~/.local/share/applications/usr/local/share/applications/usr/share/applications。如果同一个命令在多个位置都有桌面文件,它将使用我列出的三个位置中最左边的那个。 - geirha
显示为/usr/share/applications/kde4/skrooge.desktop。谢谢。 :) - KOVIKO
2这非常有用!谢谢。请注意,使用“locate *.desktop”帮助我发现来自snap软件包安装的桌面文件似乎会进入/snap//var/lib/snapd/desktop/applications/目录。 - Gabriel Staples
1使用locate *.desktop命令没有找到任何结果。可以使用find / -name '*.desktop' 2> /dev/null命令来抑制“权限被拒绝”的提示信息。 - Mark Jeronimus
1~/.local/share/applications 是您放置桌面文件的位置,这样在活动窗口中可以找到它并将其添加到收藏夹(固定在甲板上)。 - WesternGun
XDG_DATA_DIRS环境变量控制着启动器将在哪些目录中检查*.desktop文件。请参考@OndroMih的答案来搜索这些目录。 - M.W.

系统将.desktop文件存储在/usr/share/applications/目录中。不幸的是,如果你在nautilus中打开该文件夹,.desktop文件会显示为文件中指定的图标,并且文件名也会在文件中被调用出来。你也无法通过点击它们并选择编辑来修改这些文件。
要编辑这些文件,你需要在终端窗口中打开该文件夹。执行ls命令将显示所有带有实际名称的.desktop文件。当你找到想要更改的.desktop文件时,运行gksudo gedit {file-name}.desktop命令。
通常做法是将你创建或编辑的任何.desktop文件保存在你的主文件夹~/.local/share/applications中。

1从终端运行可能对某些人更方便,但也可以从Nautilus拖到gedit或其他文本编辑器中。 - Jon Hanna
目录"~/.local/share/applications"有什么用呢?那里的文件似乎没有被使用,也无法将它们添加为Unity的"快捷方式"。 - Malachiasz
4@Malachiasz 实际上,当会话重新启动时,~/.local/share/applications 中的 *.desktop 文件会被重新加载。因此,请注销并重新登录。请注意,这些文件是特定于该用户的。 - akshay2000
1我还在这个网站上找到了这个问答非常有用:如何强制Unity重新加载~/.local/share/applications/ - hakre
复制/usr/share/applications中的桌面文件会覆盖~/.local/share/applications中的条目吗?我正在尝试配置Firefox使用firejail,但每当浏览器更新时,如果我在/usr/share/applications/的桌面文件中进行编辑,我的修改都会被删除。 - Daniel
别忘了,Snap应用程序将它们的.desktop文件存储在/var/lib/snapd/desktop/applications/目录中。 - Flimm

一些补充细节以补充其他答案:
通常,软件包的.desktop文件将位于/usr/share/applications。
如果您愿意,您可以将其中一个复制到~/.local/share/applications并在那里进行编辑,而无需使用sudo。~/.local/share/applications中的项目将覆盖/usr/share/applications和/usr/local/share/applications中的匹配项目,但仅对您的用户可见。
或者,您可以将编辑后的副本放置在/usr/local/share/applications中,它将覆盖/usr/share/applications中的任何内容,并且对整个系统可见。
请注意,您不应直接编辑/usr/share/applications中的.desktop文件;当应用程序由软件包管理器更新时,您所做的任何更改都将被自动覆盖。
提取自此处

1请提供要翻译的英文文本。 - Jon Bentley
1别忘了,Snap应用程序将它们的.desktop文件存储在/var/lib/snapd/desktop/applications/目录下。 - Flimm

你可以在XDG_DATA_DIRS环境变量中找到所有包含桌面文件的目录。这些*.desktop文件可以位于该变量中每个目录下的applications目录中。例如:
> echo $XDG_DATA_DIRS
/usr/share/ubuntu:/usr/local/share/:/usr/share/:/var/lib/snapd/desktop

你可以使用这个bash脚本来列出系统使用的所有桌面文件(例如用于构建面板或应用程序菜单):
for p in ${XDG_DATA_DIRS//:/ }; do 
  find $p/applications -name '*.desktop' 
done

似乎桌面文件还可以放置在另一个目录中,该目录不在XDG_DATA_DIRS变量中。
  • ~/.local/share/applications
所以,找到系统中的所有*.desktop文件的完整脚本如下:
DATA_DIRS="$XDG_DATA_DIRS:$HOME/.local/share"
for p in ${DATA_DIRS//:/ }; do
  find $p/applications -name '*.desktop' 
done

我没有找到关于这个的任何文档,但是这里有一些关于这个环境变量的信息:https://unix.stackexchange.com/a/531664

4这是最好的答案! - xaxa
2这里缺少 ~/.local/share/applications~/var/lib/snapd/desktop/applications 对吧? - lrkwz
1@lrkwz */var/lib/snapd/desktop/applications - wjandrea
1Freedesktop.org(曾名为X Desktop Group)维护着XDG Base Directory Specification,其中包括了XDG_DATA_DIRS的环境变量。该规范不仅限于Unity Launcher,Google的ChromeOS CrostiniMicrosoft的WSLg也使用它将GNU/Linux程序集成到各自的用户界面中。 - M.W.
@lrkwz 我在我的 XDG_DATA_DIRS 环境变量中找到了 /home/USERNAME/.local/share/applications/var/lib/snapd/desktop/applications - Flimm
我认为XDG_DATA_DIRS变量的值取决于系统的版本。在我的系统(Ubuntu Focal 20.04)中,它包含/var/lib/snapd/desktop,但不包含/.local/share。另一方面,我的/.local/share/applications中的桌面文件没有显示在系统菜单中,所以我认为这个位置在我的系统中默认不支持。可能在新版本的Ubuntu上支持这个位置。 - OndroMih

Snap软件包的桌面文件可以在/var/lib/snapd/desktop/applications//snap/下找到。

相对于~/.local/share/applications$XDG_DATA_DIRS,它们的查找顺序是怎样的? - wjandrea

我知道我来晚了,但是我有一个比被接受为答案的更快的解决方案。
find / -iname "*desktop" -type f -not -path "/media*" -exec grep -il skrooge '{}' ';' 2> /dev/null

它更快,因为它不搜索挂载的数据文件系统,而且很可能桌面文件位于系统分区。

此外,它更有可能找到被接受答案中的命令所错过的内容。这是因为桌面文件不必保存应用程序名称。该命令实际上会搜索每个桌面文件中的文本。


这对我完全没有用(即使使用sudo也不行)。虽然我正在使用Manjaro Linux,但只要有findgrep命令,该命令应该可以独立于操作系统工作。但实际上,它导致命令崩溃并且没有输出任何内容。 - Rahat Zaman
@RahatZaman,运行该命令的输出是什么? - joker
抱歉,我不能直接返回文本给您,因为我是一个文本接口的AI模型。不过,如果您提供要翻译的英文句子,我将会尽力帮助您将其翻译成中文。 - Rahat Zaman
你在第一条评论中提到了“crash”。你是指什么?此外,Manjaro中的驱动器挂载在哪里?你是否已经将skrooge更新为你要找的应用程序? - joker

  • /usr/share/applications(大多数应用程序,需要管理员权限)
  • ~/.local/share/applications(个人应用程序)

1这些答案已经在两个得票最高的答案中提供了更详细的解释。 - Kevin Bowen

我实际上不知道哪个.desktop文件生效。我最好的猜测是,从https://wiki.archlinux.org/index.php/Desktop_entries开始,创建一个类似这样的脚本并运行它:
#!/bin/sh

# try to find the effective desktop file
# (there seems to be no documented standard for this)

use_if_desktop_file () {
  if [ -r "$1" ] &&
     [ "$(xdg-mime query filetype "$1")" = application/x-desktop ]; then
       echo "$1"
       exit
  fi
}

for d in ~/.local/share/applications /usr/local/share/applications \
         /usr/share/applications; do
  use_if_desktop_file "$d/$1"
  use_if_desktop_file "$d/$1.desktop"
done

# no file found
exit 1