引言
假设在 Ubuntu 系统中,应用程序菜单中出现了您希望删除的图标:
- 与应用程序一起删除 —— 将单独讨论。
- 仅删除图标 —— 本节将讨论此情况。
在此示例中,我希望仅删除 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.sh2. 否则手动删除 —— /opt/、/usr/bin/、.desktop、systemd、~/.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)。 |
这是一个不完整的列表,我希望你们不会使用其他选项 ![]()
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 权限(对于目录,该权限表示可穿越,即使用户没有读取目录内容的权限)。
这只是其中一个图标及其关联内容。目前还不清楚应用程序是如何安装的。根据表格,似乎可能是 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
请注意,这是一个简化的命令。它没有考虑文件中是否已存在该行(重复运行时),但重复添加无妨。
更改会立即生效——图标将从菜单中消失。要恢复图标,请仅删除刚才添加的行(箭头所指处)。

