如何从 Ubuntu 的菜单中移除应用图标及应用程序的安装方法

引言

假设在 Ubuntu 系统中,应用程序菜单中出现了您希望删除的图标:

  1. 与应用程序一起删除 —— 将单独讨论。
  2. 仅删除图标 —— 本节将讨论此情况。

在此示例中,我希望仅删除 Telegram 或 Telegram Desktop 的图标,而不影响应用程序本身。

安装方式

如果您不记得应用程序是如何安装的,可能使用了以下方式之一:

编号 安装方式 如何识别 如何删除(终端) 特点 / 风险
1 内置软件仓库 apt policy 应用名archive.ubuntu.com sudo apt remove --purge 应用名 && sudo apt autoremove 安全,但 autoremove 可能影响其他包 —— 请检查。
2 添加的软件仓库(PPA 等) apt policy 应用名 → 外部 URL
文件位于 /etc/apt/sources.list.d/
1. sudo apt remove 应用名
2. 删除 .list 文件 + 密钥
3. sudo apt update
删除包时务必先删除仓库,否则会出现 apt 错误。
3 .deb `dpkg -l grep 应用名` sudo apt remove --purge 应用名(比 dpkg -P 更好)
4 Snap `snap list grep 应用名<br>which 应用名/snap/bin/应用名` sudo snap remove 应用名
5 Flatpak `flatpak list grep 应用名` flatpak uninstall 应用名 && flatpak remove --unused
6 二进制文件(AppImage、.tar.gz 不在 apt/dpkg/snap
二进制文件位于 ~/Apps//opt/~/.local/bin/
rm -rf /路径/到/程序 ~/.local/share/applications/应用名.desktop ~/.config/应用名/ 无集中管理 —— 容易“忘记”某些内容。
7 .run 安装程序 通过 sudo ./应用名.run 安装
存在 /opt/应用名/uninstall.sh
1. sudo /opt/应用名/uninstall.sh
2. 否则手动删除 —— /opt//usr/bin/.desktopsystemd~/.config/
最“脏”的方式。通常不保留卸载脚本。
8 编译安装(make install which 应用名/usr/local/bin/ 1. make uninstall(如果存在)
2. 否则手动删除
无统一管理,容易遗漏某些文件。
9 管理员工具 (pipx, cargo, npm -g) which 名称~/.local/bin/, ~/.cargo/bin/ pipx uninstall 名称, cargo uninstall 名称, npm uninstall -g 名称 不会破坏系统,但可能与 apt 版本冲突(例如 node)。

这是一个不完整的列表,我希望你们不会使用其他选项 :slight_smile:

  • go install, gem install
  • Docker / Podman 图形界面镜像
  • 通过 linuxbrew / nix / guix 安装

什么不被视为独立的安装方式

  • apt install ./file.deb → 这仍然是通过 apt 安装 .deb 包,只是不是通过 dpkg
  • 图形安装器(Software Center, Discover) → 是 apt / snap / flatpak 的前端界面。
  • “添加到开机启动” / systemd --user → 这是安装后的配置,不是安装方式。

如何快速判断未知程序的安装方式?

# 1. 可执行文件在哪里?  
which 名称  

# 2. 包来源(如果是 apt/dpkg)  
dpkg -S $(which 名称) 2>/dev/null || echo "Not in dpkg"  

# 3. 检查 snap/flatpak  
snap list | grep -i 名称  
flatpak list | grep -i 名称  

# 4. 检查是否在 ~/.local/bin 或 /opt  
ls -l $(which 名称)  

# 5. 安装历史(如果最近安装过)  
grep "install.*名称" /var/log/apt/history.log 2>/dev/null  
journalctl --since "2 weeks ago" | grep -i "install.*名称"  

清洁系统建议:

  • 对于 .run 程序,未来请考虑使用 AppImage 或通过 bubblewrap / toolbox 实现隔离。
  • 代替 make install,请使用 checkinstall → 生成 .deb 包,可通过 apt 容易卸载。
  • 通过 ~/.local/share/applications/ 管理用户 .desktop 文件 —— 它们总是覆盖系统默认设置。

应用程序菜单图标文件在哪里?

这不是图标,而是启动脚本。类似于用于启动服务的脚本(还记得吗?链接

其中一个位置:

/usr/share/applications/  

电报(Telegram)应用程序分析

ls -l /usr/share/applications/ | grep -i tele  
-rw-r--r-- 1 root root   371 Mar  6  2020 telegram.desktop  
cat /usr/share/applications/telegram.desktop  

[Desktop Entry]  
Encoding=UTF-8  
Version=1.0  
Type=Application  
Terminal=false  
Name=Telegram Desktop  
Exec=/opt/telegram/Telegram -- %u  
Comment=Official desktop version of Telegram messaging app  
Icon=/opt/telegram/telegram.svg  
StartupWMClass=Telegram  
Categories=GNOME;GTK;Network;  
MimeType=application/x-xdg-protocol-tg;x-scheme-handler/tg;  
X-Desktop-File-Install-Version=0.22  

由此可知,可执行文件位于:

ls -l /opt/telegram/  

total 190652  
-rwxr-xr-x 1 root root        55 Mar  6  2020 Telegram  
-rwxrwxr-x 1 root root   2184648 Nov  8 14:17 Updater  
-rwxrwxr-x 1 root root 193023296 Nov  8 14:17 telegram  
-rw-r--r-- 1 root root      4762 Mar  6  2020 telegram.svg  

现在清楚了,这个图标签名是 Telegram Desktop

指向文件 /opt/telegram/Telegram。它异常小,仅 55 字节,我们来看看内容:

cat /opt/telegram/Telegram  

#!/usr/bin/env bash  
/opt/telegram/telegram -noupdate $@  

这是一个包装脚本(wrap=包装),它反过来调用 /opt/telegram/telegram,并传入命令行参数 --noupdate,告诉 Telegram 不自动检查和安装更新。

$@ 是一个特殊变量,展开为传递给脚本的独立参数。建议在双引号中使用,以避免参数中包含空格时的问题。但这里可能不需要,因为用户名或登录名中不允许包含空格和特殊字符。

文件 /opt/telegram/telegram 是可执行文件 —— 它具有 x 权限(对于目录,该权限表示可穿越,即使用户没有读取目录内容的权限)。

:backhand_index_pointing_right: 这只是其中一个图标及其关联内容。目前还不清楚应用程序是如何安装的。根据表格,似乎可能是 run 安装程序,但不确定。Telegram 可能是通过应用商店的 snap 安装,也可能是 tar.gz 压缩包。后者可能性更大。

要查找第二个应用程序的文件,使用 whence 命令。

whence

严格来说,这不是一个命令,而是一个别名(即一个命令名下隐藏多行代码)。

打开你的 ~/.bash_aliases —— 如果文件不存在,请先创建它。添加以下内容:

# whence — 快速检查安装方式  
whence() {  
    local prog="$1"  
    [ -z "$prog" ] && { echo "Usage: whence <program>"; re  
```1;

    echo "=== $prog ==="
    echo "• which: $(which "$prog" 2>/dev/null || echo '—')"
    echo "• snap: $(snap list 2>/dev/null | grep "^$prog " || echo '—')"
    echo "• flatpak: $(flatpak list --app 2>/dev/null | awk -v p=\"$prog\" '$1==p {print $1\":\"$3}' || echo '—')"
    echo "• dpkg: $(dpkg -S \"$(which \"$prog\" 2>/dev/null)\" 2>/dev/null | cut -d: -f1 || echo '—')"
    echo "• .desktop: $(find ~/.local/share/applications /usr/share/applications -name \"*$prog*.desktop\" 2>/dev/null | head -1 || echo '—')"
}

这样设置是让 .bash_aliases~/.bashrc 文件中被调用。因此,在修改该文件后,请运行以下命令以应用更改(这些更改仅在您运行下面的命令的终端会话中生效,或在重新登录系统时生效):

source ~/.bashrc

从外部看没有任何变化,但在当前会话中将出现新的变量和别名。

请检查:

whence telegram

=== telegram ===
• which: —
• snap: —
• flatpak: 
• dpkg: 
• .desktop: /home/ivan/.local/share/applications/org.telegram.desktop._18faa92ddda377ceaa5a576303af9e59.desktop

您可能会注意到,这里的 .desktop 文件不在系统目录 /usr/share/applications/ 中,而在用户的主目录下(请看其中有多少个文件):

ls -l ~/.local/share/applications/

-rwxrwxr-x 1 ivan ivan 579 Nov  8 16:22 org.telegram.desktop._18faa92ddda377ceaa5a576303af9e59.desktop

目前我们关注的是该文件的内容:

cat ~/.local/share/applications/org.telegram.desktop*

[Desktop Entry]
Name=Telegram
Comment=New era of messaging
TryExec=/opt/telegram/telegram
Exec=/opt/telegram/telegram -- %u
Icon=org.telegram.desktop
Terminal=false
StartupWMClass=TelegramDesktop
Type=Application
Categories=Chat;Network;InstantMessaging;Qt;
MimeType=x-scheme-handler/tg;x-scheme-handler/tonsite;
Keywords=tg;chat;im;messaging;messenger;sms;tdesktop;
Actions=quit;
DBusActivatable=true
SingleMainWindow=true
X-GNOME-UsesNotifications=true
X-GNOME-SingleWindow=true

[Desktop Action quit]
Exec=/opt/telegram/telegram -quit
Name=Quit Telegram
Icon=application-exit

该图标名称为 Telegram(不含 “Desktop”)。

脚本指向的是同一个可执行文件 /opt/telegram/telegram,只是没有传递变量和“不更新”的参数。我不清楚为什么这样设计。内心的声音认为,开发者应该在任何部署方式下都保持一致性。但这里可能并不关键。登录信息不是必需的,它会从设置中自动获取。唯一的区别在于自动更新软件。顺便说一下,用户在一种情况下会看到提示“Telegram 需要更新”,而在另一种情况下应用程序会自动更新并等待重启(但这并不一定如此)。

总之,我们发现两个图标都指向同一个 Telegram 实例,这正是最重要的。现在可以删除其中一个图标,因为它们共享同一程序和设置。

让我们删除较不美观的那个:

~/.local/share/applications/org.telegram.desktop._18faa92ddda377ceaa5a576303af9e59.desktop

请不要删除该文件。隐藏图标的方法不同!

仅从菜单中隐藏 Telegram 图标(保留程序和服务)

在脚本中,向 [Desktop Entry] 部分添加参数 Hidden=true

sed -i '/^\\[Desktop Entry\\]$/a Hidden=true' ~/.local/share/applications/org.telegram.desktop._18faa92ddda377ceaa5a576303af9e59.desktop

请注意,这是一个简化的命令。它没有考虑文件中是否已存在该行(重复运行时),但重复添加无妨。

更改会立即生效——图标将从菜单中消失。要恢复图标,请仅删除刚才添加的行(箭头所指处)。