Как удалить значок приложения из меню 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) apt управляет зависимостями, dpkg — нет.
4 Snap snap list | grep имя
which имя/snap/bin/имя
sudo snap remove имя Изолирован, но тяжёлый. Автообновляется.
5 Flatpak flatpak list | grep имя flatpak uninstall имя && flatpak remove --unused Runtime остаётся — чистите --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/, .desktop, systemd, ~/.config/
Наиболее “грязный” способ. Часто не оставляет uninstall-скрипта.
8 Компиляция (make install) which имя/usr/local/bin/ 1. make uninstall (если есть)
2. Иначе — ручное удаление или checkinstall в будущем
Высокий риск засорения. Используйте checkinstall или stow.
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-образы с GUI
  • Установка через linuxbrew / nix / guix

Что не считается отдельным способом

  • apt install ./file.deb → это всё равно установка .deb -пакета, просто через apt , а не dpkg .
  • GUI-установщики (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 .
  • Управляйте пользовательскими .desktop -файлами через ~/.local/share/applications/ – они всегда переопределят системные.

Где лежат все файлы значков для меню приложений?

Это не значок, а стартовый скрипт. Похожий на те, которые используются для запуска служб (помните?)

Одно из мест:

/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 $@

Это wrapper-скрипт (wrap=обертка), который в свою очередь вызывает /opt/telegram/telegram с флагом командной строки, который говорит Telegram не проверять и не устанавливать обновления автоматически.

$@ это специальная переменная, которая раскрывается в отдельные аргументы, переданные скрипту. Рекомендуют все-таки использовать эту конструкцию в двойных кавычках, чтобы избежать проблем, когда в аргументе окажется пробел. Но видимо тут это исключено, так как там используется то ли никнейм, то ли логин, в которых запрещены пробелы и спецсимволы.

Файл /opt/telegram/telegram является исполняемым - у него стоит атрибут x (для папки такой атрибут означает другое - сквозь такую папку можно пройти насквозь, даже если у пользователя нет прав на чтение содержимого этой папки.

:backhand_index_pointing_right: это только один из значков и что с ним связано. Пока неясно, каким образом было установлено приложение. По таблице как будто это был run-установщик, но точно нет. Телега поставляется либо как snap в магазине приложений, либо как tar.gz архив. Вот на второе похоже больше.

Чтобы найти файлы второе приложение, воспользуемся командой whence.

whence

Вообще-то это не команда, а алиас (это когда под словом команды скрывается много строк кода).

Откройте ваш ~/.bash_aliases - если файл не существует, то создайте его. Добавьте в него эти строки:

# whence — быстрая проверка способа установки
whence() {
    local prog="$1"
    [ -z "$prog" ] && { echo "Usage: whence <program>"; return 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, только без передачи переменной и ключа “не обновляться”. Я не знаю, почему так. Внутренний голос говорит, что у разработчика должно быть однообразно при любых вариантах развертывания. Но тут наверное этот момент не является критичным. Передача логина необязательна, это подтянется из настроек. Отличие будет лишь в автообновлении ПО. И кстати пользователь в одном случае увидит плашку, что Телеграм нужно обновить, а в другом приложение обновится само и будет ждать перезапуска (но это не точно).

В общем, мы нашли, что оба значка ведут к одному и тому же экземпляру Телеграм, а это самое главное. Теперь может удалим один из них, раз прога у них общая и настройки (профиль) тоже.

Давайте удалим наименее красивый:

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

НЕ УДАЛЯЙТЕ файл. Скрытие значка делается по-другому!

Удаление только значка Telegram из меню (оставив программу и сервис)

В скрипт вносится параметр Hidden=true в секцию [Desktop Entry] :

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

Обратите внимание, это упрощенная команда. Она не учитывает, есть ли такая строка в файле (при повторном запуске) или еще нет. Но дубликат не страшен.

Изменение применится моментально - значок исчезнет из меню. Чтобы вернуть значок, удалите только что добавленную строку (отмечена стрелкой).