Почему apt удаляет нежелательные пакеты при предоставлении * в качестве суффикса? [Дубликат]

Для будущих читателей, желающих создать закладки для удаленных мест, которые не будут использоваться по умолчанию для корневой папки или домашней папки удаленного пользователя:

Создать закладку Редактировать закладки (ctrl + b) и указать удаленный путь в поле местоположения
1
задан 9 March 2014 в 22:05

2 ответа

Если вы не знаете точно, что вы делаете, вы не должны использовать:

sudo apt-get remove package.*
#                          ⤷ or any other character in the place of dot

, так как это может удалить непреднамеренные пакеты и вызвать больше проблем, чем решает. [F6] будет соответствовать всем пакетам (и их зависимостям), содержащим строку package в их имени. Это от man apt-get, где-то в строке 110:

       If no package matches the given expression and the expression
       contains one of '.', '?' or '*' then it is assumed to be a POSIX
       regular expression, and it is applied to all package names in the
       database. Any matches are then installed (or removed). Note that
       matching is done by substring so 'lo.*' matches 'how-lo' and
       'lowest'. If this is undesired, anchor the regular expression with
       a '^' or '$' character, or create a more specific regular
       expression.

И это из регулярных выражений / POSIX Базовые регулярные выражения Wikibooks:

* Соответствует предыдущему элементу ноль или более раз. Например, ab*c соответствует «ac», «abc», «abbbc» и т. Д. [F11] соответствует «», «x», «y», «z», «zx», «zyx», «xyzzy» ", и так далее. \(ab\)* соответствует «", "ab", "abab", "ababab" и т. д.

В любом случае, если вы действительно хотите запустить что-то вроде sudo apt-get remove package.* (или sudo apt-get remove packagey* или sudo apt-get remove packagec* - все в этом случае одинаковы), сначала запустите его с помощью -s (), чтобы увидеть, что именно он будет делать (см. man apt-get для получения дополнительной информации).

Теперь я думаю, что вы можете решить свою проблему, используя следующие два шага:

Переустановите все удаленные пакеты Удалить только ruby:
sudo apt-get remove ruby
Или, если вы хотите удалить все пакеты, начиная их имена с ruby:
sudo apt-get remove ^ruby
Но лучше сначала имитировать:
apt-get -s remove ^ruby
[!d22 ]
8
ответ дан 24 May 2018 в 10:59
  • 1
    Так что все зависит от зависимостей ... – diegoaguilar 9 March 2014 в 12:26
  • 2
    +1 для широко неизвестной опции -s. – jobin 9 March 2014 в 18:16
  • 3
    package* также будет вести себя удивительно, если запустить из каталога, содержащего любые файлы, начиная с package. Лучше процитировать: 'package*' – Charles Duffy 9 March 2014 в 20:44

Apt-get работает с регулярными выражениями, что означает, что ruby* выбирает все пакеты, содержащие rub в их имени. Правильный способ удаления всех пакетов, начинающихся с ruby, это:

apt-get remove ^ruby
4
ответ дан 24 May 2018 в 10:59
  • 1
    +1 от меня, но можете ли вы объяснить, почему ruby* выбирает все пакеты, содержащие rub в их имени , а не ruby ​​, как многие могут подумать? – Radu Rădeanu 2 September 2014 в 13:57
  • 2
    @ RaduRădeanu В регулярном выражении y* означает «ноль или более y s.» – Eliah Kagan 5 September 2014 в 05:07
  • 3
    @ EliahKagan Лично я знаю это; см. мой ответ ...: D – Radu Rădeanu 5 September 2014 в 05:20
  • 4
    @ RaduRădeanu, это точная причина, по которой я разместил это как комментарий, а не как ответ. Я не собираюсь писать, как работают регулярные выражения, извините. – Andrea Corbellini 5 September 2014 в 22:23

Другие вопросы по тегам:

Похожие вопросы: