Jak usunąć wszystkie pakiety, które pasują do określonego wzorca?


26

Chcę odinstalować libreoffice. Program składa się z około trzech tuzinów modułów. Najlepiej byłoby je usunąć za pomocą:

aptitude remove libreoffice3.6* libreoffice-debian-menus libobasis3.6-*

ale to się nie udaje

Couldn't find any package whose name or description matched "libreoffice3.6*"

itp.

Jak usunąć zestaw pakietów według wzoru?

PS: Cieszę się z odpowiedzi za pomocą dpkglub aptteż


Próbujesz poznać odpowiedź na temat określonego wzoru lub jesteś zadowolony z usunięcia komponentów LibreOffice?
Anwar

1
możliwy duplikat Jak odinstalować LibreOffice? Odpowiedź jest prawdopodobna: działa to tylko w wersji 3.6 i nie używasz wersji 3.6 :-)
Rinzwind

Używam libreoffice jako przykładu, ponieważ zawiera tak wiele części. Ale miałem ten sam problem z jądrem (czyszczenie starych wersji)
Aaron Digulla

Odpowiedzi:


26
  1. Używaj apt-get, nie aptitudei używaj wyrażeń regularnych.

  2. W wyrażeniu regularnym .oznacza dowolny znak i *oznacza zero lub więcej razy. Tak więc wyrażenie libreoffice.*pasuje do dowolnej nazwy pakietu zawierającej ciąg libreoffice, po której następuje dowolna liczba znaków.

  3. Otocz wyrażenie regularne pojedynczymi cudzysłowami, aby uniknąć interpretacji gwiazdki przez powłokę. (Jeśli masz plik o nazwie libreoffice.examplenp. W bieżącym katalogu, powłoka zastąpi libreoffice.*go libreoffice.example, więc musisz użyć pojedynczych cudzysłowów, aby zatrzymać to zachowanie).

Wynik:

sudo apt-get remove 'libreoffice.*'

Dzięki, to działa. Co ciekawe, działa również ze wzorem libreoffice*(tj. Wzorami w stylu glob), co trochę mnie dezorientuje, ponieważ żaden z nich nie powinien działać :-)
Aaron Digulla

3
Dla tych, którzy chcą to przetestować, skorzystaj z opcji, --dry-runaby zobaczyć, co zostanie usunięte bez żadnych zmian w systemie.
Aaron Digulla

@AaronDigulla Nie wiedziałem jeszcze o --dry-run. To się przyda! Dzięki!
Glutanimate

apt-get jest również dość zły w obsłudze wyrażeń regularnych, porównaj oba rozwiązania w tej odpowiedzi .
Braiam

Aby to wyjaśnić, aptużywa wyrażeń regularnych POSIX. From man apt-get(Debian Jessie): „Jeśli żaden pakiet nie pasuje do podanego wyrażenia, a wyrażenie zawiera jedno z„. ”,„? ” lub „*”, wówczas przyjmuje się, że jest to wyrażenie regularne POSIX ... ”
x-yuri,

6

Alternatywą jest:

dpkg -l | grep libreoffice | awk '{print $2}' | xargs -n1 echo

Spowoduje to wyświetlenie wszystkich pasujących pakietów libreoffice. Po potwierdzeniu, że są to wszystkie te, których chcesz się pozbyć, uruchom następujące polecenie ... ostrożnie :

dpkg -l | grep libreoffice | awk '{print $2}' | xargs -n1 sudo apt-get purge -y

Pomysł:

  1. Poproś system o wylistowanie wszystkich zainstalowanych pakietów
  2. Filtruj, aby wyświetlić tylko te pasujące libreoffice
  3. Filtruj, aby wyświetlić tylko kolumnę z nazwą pakietu
  4. Uruchom komendę purge na każdym z tych pakietów

1
być może mógłbyś zasugerować dodanie -popcji, która xargswyświetli monit o potwierdzenie przed wykonaniem każdego skonstruowanego polecenia, lub najpierw sprawdzenie za pomocą echozamiastsudo apt-get purge
Zanna

1
@Zanna -pby pomógł, ale nie byłoby to jednorazowe polecenie. Użyłem echa, aby przetestować to, co otrzymałem przed uruchomieniem polecenia, dlatego warto to polecić.
aalaap

2
Mogę dać Ci +1, teraz uczyniłeś to bezpieczniejszym :)
Zanna,

Myślę, że to -n1jest dobre, echoale musicie usunąć to z czystki; w przeciwnym razie kolejność zależności (a zależy od b, najpierw próbuje usunąć b) może przerwać czyszczenie.
Aaron Digulla,

Twoje rozwiązanie jest najlepsze, jakie do tej pory znalazłem, dziękuję.
João Pedro,

5

Aptitude obsługuje globalne wzorce, a także kolejne całkiem fajne dopasowania:

aptitude remove '?and(?name(libreoffice), name(3.6), ~i)' libreoffice-debian-menus

To pasuje do żadnego pakietu, który ma w jego nazwę libreofficei 3.6, a także jest zainstalowany (to, co ~istoi za.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.