использование sudo apt-get remove ^k3b вместо этого. Когда вы устанавливаете или удаляете пакеты, *это часто опасно и редко требуется. Если вы используете *, вы должны заключить его в кавычки, но это не делает его более безопасным, потому что его тенденция выбирать гораздо больше пакетов, чем вы предполагаете, является результатом способа aptи apt-getинтерпретировать его, а не эффект расширения имени пути .
- Даже безопасное использование
* является часто ненужным .
- Небезопасное использование жестоко . Удаление
k3b*удаляет каждый пакет, который содержится в k3 любом месте его имени (и каждый пакет, который зависит от такого пакета). Это не опечатка - k3достаточно наличия даже без b, потому что b*означает «ноль или более bs».
Когда ты бежишь apt или apt-getс действием install, removeили purge, каждый последующий аргумент является первым 1 интерпретируется как имя отдельного пакета. Если пакет с таким точным именем существует, для него выполняется действие.
Если такого пакета нет aptи apt-getон проверит, содержит ли аргумент какие-либо из общих метасимволов 2 регулярного выражения , .? , +,* , |, \[, ^, или$ . Если нет, то сделано - пакет не найден.
Если это действительно содержит любой из этих символов, то он обрабатывается как регулярное выражение и сопоставляется с любой частью любого имени пакета. Это не должно соответствовать целому имени. Как уже говорили другие, *регулярное выражение не означает то же самое, что *и глобус. ?тоже нет В регулярном выражении:
*позволяет предыдущему элементу появляться любое количество раз включая только один раз или вообще не - вместо ровно одного раза.
?делает предыдущий элемент необязательным - то есть, он позволяет ему появляться ноль или один раз.
apt-get (8) ( man apt-get) говорит:
Если ни один пакет не соответствует данному выражению, и выражение содержит один из '.', '?' или '*', тогда предполагается, что это регулярное выражение POSIX, и оно применяется ко всем именам пакетов в базе данных. Любые совпадения затем устанавливаются (или удаляются). Обратите внимание, что сопоставление выполняется с помощью подстроки, поэтому 'lo. *' Соответствует 'how-lo' и 'наименьшему' Если это нежелательно, закрепите регулярное выражение символом «^» или «$» или создайте более конкретное регулярное выражение.
Упоминает только страница руководства ., ?и *, но она является неполной , так как +, |, [, ^и $также достаточно , чтобыapt-get или aptинтерпретировать шаблон как регулярное выражение. 3
Хотя вы можете сопоставить любое количество любых символов с .*- не просто - *вам это нужно, только если оно будет появляться в середине вашего регулярного выражения. Поскольку шаблон сопоставляется с любой подстрокой имени пакета, он не имеет смысла в конце (или начале) шаблона.
В справочной странице упоминается ^и$ . Они (особенно ^) являются ключевыми для написания безопасных, эффективных схем для использования с install, removeили purgeдействий в aptили apt-get.
^привязывает регулярное выражение к началу всей строки. ^k3bвыбирает все пакеты, имена которых начинаются с k3b.
$привязывает регулярное выражение к концу всей строки. k3b$выбрал бы все пакеты, имена которых заканчиваются на k3b.
Поэтому вы можете использовать эту команду для безопасного удаления пакетов:
sudo apt-get remove ^k3b
Наконец, в конкретном случае, который вы упомянули, вы могли бы просто передать оба имени самостоятельно:
sudo apt-get remove k3b k3b-data
Тогда вы избежите всей этой сложности! (Хотя привязка к нему ^проста, когда вы к нему привыкли.) Или используйте расширение скобки , которое ваша оболочка раскрывает в приведенную выше команду:
sudo apt-get remove k3b{,-data}
1 Есть два исключения из этого: (а) некоторые параметры (например, -f, --purge) признаются, и (б) некоторые знаки пунктуации , появляющиеся в конце аргумента , которые иначе были бы приняты в качестве имени пакета , чтобы выполнить действие , может быть используется для изменения того, что сделано (например, sudo apt install ubuntu-desktop^устанавливает задачу, а не пакет, и когда ^появляется в конце).
2 Существуют и другие метасимволы регулярных выражений. Например, \поддерживается все диалекты регулярных выражений и часто используются. ., ?, +, *, |, [, ^, И$ просто оказались метасимволами метких разработчики решили бы вызвать интерпретацию как регулярное выражение (после разрешения в качестве точного пакета с именем не удался).
3 Самый простой способ убедиться в этом - смоделировать установку или удаление с таким шаблоном, используя -sопцию, как описано выше. Например, запуск apt -s install ^virtualboxшоу показывает, что sudo apt install ^virtualboxпопытка установить каждый пакет, о котором менеджер пакетов знает, с чьего имени начинается virtualbox. Однако такое поведение также можно проверить, изучив исходный код . Проверьте CacheSetHelper::PackageFromRegExфункцию в cacheset.cc.