Прошлой ночью я пытался записать компакт-диски. Раздражая k3b и выбрав вместо этого brasero, я решил удалить k3b.
Я набрал:
sudo apt-get remove k3b
Я дважды нажал на tab и увидел, что в моей системе есть как k3b, так и k3b-данные. Предполагая, что мне не нужны данные k3b в моей системе без k3b, я тоже хотел их удалить, поэтому набрал:
sudo apt-get remove k3b*
К сожалению, я нажал Y, чтобы подтвердить, не глядя. Он удалил намного больше, чем k3b
и k3b-data
. Это удаленные пакеты, которые не соответствуют моему k3b*
регулярному выражению. Например: transmission
и network-manager
.
Я абсолютно уверен , что у меня не было пространства между k3b
и , *
но я не знаю , почему - то это устранило бы все , что он сделал. Есть ли что-то в apt-get, что я неправильно понимаю?
apt
package-management
regex
Стив Гойкович
источник
источник
Ответы:
Команда, которую вы хотите
sudo apt-get remove '^k3b.*'
, потому что:.*
соответствовать любому персонажу, любое количество раз^
соответствовать началу строки*
как подстановочный знак(Этот ответ завершает и суммирует предыдущую информацию, предоставленную qbi и Flimm)
источник
.*
. Вы можете просто использоватьsudo apt-get remove ^k3b
. Наличие^
достаточно для того, чтобы аргумент интерпретировался как регулярное выражение, и когдаapt
илиapt-get
интерпретирует аргумент как регулярное выражение, он совпадает с ним в любом месте имени пакета. Вот почему вам нужно^
- привязать совпадение к началу имени пакета. Регулярное выражение не должно совпадать с полным именем пакета, только с любой его частью.^
, то вам и не нужно.*
)Регулярное выражение
*
обозначает ноль или сколь угодно много. Таким образом, вы сказали,apt-get
чтобы удалить все, что содержит,k3
а затем любое количествоb
, так что в основном все, что содержитk3
. Если я попробую вашу команду в моей системе, она захочет удалить 58 пакетов.источник
*
работает как подстановочный знак для bash, как в DOS, но некоторые команды, например,apt-get
ожидают регулярное выражение. Когда вы печатаетеsudo apt-get remove -s k3b*
, bash сначала будет искать любые файлы в вашем текущем каталоге, которые начинаются сk3b
. Если он найдет их, он заменит этот аргумент этими именами файлов. Если нет, он перейдетk3b*
непосредственно кapt-get
, что будет интерпретировать его как регулярное выражение. Если вы не хотите, чтобы bash сначала интерпретировал звездочку как подстановочный знак (чего, вероятно, нет),sudo apt-get remove -s 'k3b*'
sudo apt-get remove -s 'k3b.*'
. Просто наткнулся на этот ответ и считаю действительно важным знать. ИМХО, это довольно неожиданно, и я бы совершенно отметил это как «неожиданное поведение» ошибки apt-get ... вы обычно ожидаете значение «glob», а не «regexp», если оно не указано. В любом случае спасибо и +1!-s
опция означает «симуляция». Он говоритapt-get
не выполнять операцию, а просто информировать вас о том, что произойдет без-s
опции.использование
sudo apt-get remove ^k3b
вместо этого. Когда вы устанавливаете или удаляете пакеты,*
это часто опасно и редко требуется. Если вы используете*
, вы должны заключить его в кавычки, но это не делает его более безопасным, потому что его тенденция выбирать гораздо больше пакетов, чем вы предполагаете, является результатом способаapt
иapt-get
интерпретировать его, а не эффект расширения имени пути .*
является часто ненужным .k3b*
удаляет каждый пакет, который содержится вk3
любом месте его имени (и каждый пакет, который зависит от такого пакета). Это не опечатка -k3
достаточно наличия даже безb
, потому чтоb*
означает «ноль или болееb
s».Когда ты бежишь
apt
илиapt-get
с действиемinstall
,remove
илиpurge
, каждый последующий аргумент является первым 1 интерпретируется как имя отдельного пакета. Если пакет с таким точным именем существует, для него выполняется действие.Если такого пакета нет
apt
иapt-get
он проверит, содержит ли аргумент какие-либо из общих метасимволов 2 регулярного выражения ,.
?
,+
,*
,|
,\[
,^
, или$
. Если нет, то сделано - пакет не найден.Если это действительно содержит любой из этих символов, то он обрабатывается как регулярное выражение и сопоставляется с любой частью любого имени пакета. Это не должно соответствовать целому имени. Как уже говорили другие,
*
регулярное выражение не означает то же самое, что*
и глобус.?
тоже нет В регулярном выражении:*
позволяет предыдущему элементу появляться любое количество раз включая только один раз или вообще не - вместо ровно одного раза.?
делает предыдущий элемент необязательным - то есть, он позволяет ему появляться ноль или один раз.apt-get (8) (
man apt-get
) говорит:Упоминает только страница руководства
.
,?
и*
, но она является неполной , так как+
,|
,[
,^
и$
также достаточно , чтобыapt-get
илиapt
интерпретировать шаблон как регулярное выражение. 3Хотя вы можете сопоставить любое количество любых символов с
.*
- не просто -*
вам это нужно, только если оно будет появляться в середине вашего регулярного выражения. Поскольку шаблон сопоставляется с любой подстрокой имени пакета, он не имеет смысла в конце (или начале) шаблона.В справочной странице упоминается
^
и$
. Они (особенно^
) являются ключевыми для написания безопасных, эффективных схем для использования сinstall
,remove
илиpurge
действий вapt
илиapt-get
.^
привязывает регулярное выражение к началу всей строки.^k3b
выбирает все пакеты, имена которых начинаются сk3b
.$
привязывает регулярное выражение к концу всей строки.k3b$
выбрал бы все пакеты, имена которых заканчиваются наk3b
.Поэтому вы можете использовать эту команду для безопасного удаления пакетов:
Наконец, в конкретном случае, который вы упомянули, вы могли бы просто передать оба имени самостоятельно:
Тогда вы избежите всей этой сложности! (Хотя привязка к нему
^
проста, когда вы к нему привыкли.) Или используйте расширение скобки , которое ваша оболочка раскрывает в приведенную выше команду:1 Есть два исключения из этого: (а) некоторые параметры (например,
-f
,--purge
) признаются, и (б) некоторые знаки пунктуации , появляющиеся в конце аргумента , которые иначе были бы приняты в качестве имени пакета , чтобы выполнить действие , может быть используется для изменения того, что сделано (например,sudo apt install ubuntu-desktop^
устанавливает задачу, а не пакет, и когда^
появляется в конце).2 Существуют и другие метасимволы регулярных выражений. Например,
\
поддерживается все диалекты регулярных выражений и часто используются..
,?
,+
,*
,|
,[
,^
, И$
просто оказались метасимволами метких разработчики решили бы вызвать интерпретацию как регулярное выражение (после разрешения в качестве точного пакета с именем не удался).3 Самый простой способ убедиться в этом - смоделировать установку или удаление с таким шаблоном, используя
-s
опцию, как описано выше. Например, запускapt -s install ^virtualbox
шоу показывает, чтоsudo apt install ^virtualbox
попытка установить каждый пакет, о котором менеджер пакетов знает, с чьего имени начинаетсяvirtualbox
. Однако такое поведение также можно проверить, изучив исходный код . ПроверьтеCacheSetHelper::PackageFromRegEx
функцию вcacheset.cc
.источник
Скорее всего, вы удалите библиотеку с k3b, от которой зависели эти программы.
Короче говоря, вы никогда не узнаете. Я рекомендую не использовать подстановочный знак, чтобы удалить что-либо и прочитать что-либо по запросу (извините)
Кроме того, при поиске без регулярного выражения -n используются все поля, а не только имена.
http://ccrma.stanford.edu/planetccrma/man/man8/apt-cache.8.html
также Qbi правильно, ваше регулярное выражение имеет недостатки с самого начала
источник
apt-get remove
, толькоapt-get cache
. Кажется, что на самом деле,apt-get remove
ищет только имена пакетов, а не описания.