Ostatniej nocy próbowałem nagrać płyty CD. Rozzłościło mnie k3b i zamiast tego zdecydowałem się na brasero, więc postanowiłem usunąć k3b.
Wpisałem:
sudo apt-get remove k3b
Nacisnąłem klawisz Tab dwa razy i zobaczyłem, że mam zarówno dane k3b, jak i k3b w moim systemie. Zakładając, że nie potrzebowałbym danych k3b w moim systemie bez k3b, chciałem je również usunąć, więc wpisałem:
sudo apt-get remove k3b*
Niestety uderzyłem Y, żeby potwierdzić, nie patrząc. Odinstalował o wiele więcej niż k3b
i k3b-data
. Odinstalował pakiety, które nie pasowały do mojego k3b*
wyrażenia regularnego. Na przykład: transmission
i network-manager
.
Jestem prawie pewna, że nie ma przestrzeni między k3b
i *
, ale nie wiem dlaczego jeszcze byłoby usunąć wszystko, co zrobił. Czy jest coś w apt-get, czego nie rozumiem?
apt
package-management
regex
Steve Goykovich
źródło
źródło
Odpowiedzi:
Polecenie, które chcesz
sudo apt-get remove '^k3b.*'
, ponieważ:.*
dopasować dowolną postać, dowolną liczbę razy^
dopasować początek łańcucha*
zastępczego(Ta odpowiedź uzupełnia i podsumowuje poprzednie informacje dostarczone przez qbi i Flimm)
źródło
.*
. Możesz po prostu użyćsudo apt-get remove ^k3b
. Obecność^
argumentu wystarcza, aby argument został zinterpretowany jako wyrażenie regularne, a gdyapt
lubapt-get
interpretuje argument jako wyrażenie regularne, dopasowuje go w dowolnym miejscu w nazwie pakietu. Dlatego potrzebujesz^
- do zakotwiczenia dopasowania na początku nazwy pakietu. Wyrażenie regularne nie musi pasować do całej nazwy pakietu, tylko do dowolnej jego części.^
, to nie potrzebujesz.*
)Wyrażenie regularne
*
oznacza zero lub dowolnie wiele. Więc kazałeśapt-get
usunąć wszystko, co zawiera,k3
a następnie dowolną liczbęb
, więc w zasadzie wszystko, co zawierak3
. Jeśli spróbuję wykonać polecenie w moim systemie, chce usunąć 58 pakietów.źródło
*
Działa jako zamiennika dowolnego ciągu bash jak w DOS, ale niektóre polecenia podobaapt-get
oczekiwać regex. Podczas pisaniasudo apt-get remove -s k3b*
, bash najpierw szuka plików w bieżącym katalogu, które zaczynają się odk3b
. Jeśli znajdzie jakiś, zastąpi ten argument tymi nazwami plików. Jeśli nie, przejdziek3b*
bezpośrednio doapt-get
, co zinterpretuje to jako wyrażenie regularne. Jeśli nie chcesz, aby bash zinterpretował gwiazdkę jako symbol wieloznaczny jako pierwszy (czego prawdopodobnie nie masz), otoczyć argument pojedynczymi cudzysłowami, jak poniżej:sudo apt-get remove -s 'k3b*'
sudo apt-get remove -s 'k3b.*'
. Natknąłem się na tę odpowiedź i uważam, że to naprawdę ważne, aby wiedzieć. IMHO jest to dość nieoczekiwane i naznaczyłbym to jako błąd „nieoczekiwanego zachowania” apt-get ... zwykle oczekujesz znaczenia „glob”, a nie „regexp”, jeśli nie zostanie określone. W każdym razie dzięki i +1!-s
opcja oznacza „symulację”. Mówi,apt-get
aby nie wykonywać operacji, ale po prostu informować o tym, co by się stało bez-s
opcji.Użyj
sudo apt-get remove ^k3b
zamiast tego. Podczas instalowania lub usuwania pakietów*
jest często niebezpieczny i rzadko potrzebny. Jeśli używasz*
, powinieneś go zacytować, ale to nie czyni go bezpieczniejszym, ponieważ jego tendencja do wybierania znacznie większej liczby pakietów, niż zamierzasz, jest wynikiem sposobuapt
iapt-get
interpretacji, a nie efektem rozwijania nazwy ścieżki .*
są często niepotrzebne .k3b*
usuwa każdy pakiet, który zawierak3
dowolne miejsce w jego nazwie (i każdy pakiet, który zależy od takiego pakietu). To nie jest literówka - zawieraniek3
jest wystarczające, nawet bezb
, ponieważb*
oznacza „zero lub więcejb
s”.Po uruchomieniu
apt
lubapt-get
zinstall
,remove
lubpurge
działania, każdy kolejny argument to pierwszy 1 interpretowane jako nazwa opakowaniu jednostkowym. Jeśli istnieje pakiet o tej dokładnej nazwie, wykonywana jest dla niego akcja.Jeśli nie ma takiego pakietu,
apt
iapt-get
sprawdzi, czy argument zawiera którekolwiek z typowych wyrażeń regularnych metaznaki 2.
,?
,+
,*
,|
,\[
,^
, lub$
. Jeśli nie, to gotowe - nie znaleziono pakietu.Jeśli nie zawierają żadnego z tych znaków, to jest traktowane jako wyrażenie regularne i porównywana z jakiejkolwiek części jakiejkolwiek nazwy pakietu. Nie musi pasować do całej nazwy. Jak powiedzieli inni,
*
wyrażenie regularne nie oznacza tego samego, co*
glob.?
też nie. W wyrażeniu regularnym:*
pozwala, aby poprzedni element pojawiał się dowolną liczbę razy - w tym tylko raz lub wcale - zamiast dokładnie raz.?
sprawia, że poprzedni element jest opcjonalny - to znaczy, że może pojawić się zero lub jeden raz.apt-get (8) (
man apt-get
) mówi:Manpage tylko wspomina
.
,?
i*
, ale jest niekompletna , jak+
,|
,[
,^
, i$
są również wystarczające, aby pozwolićapt-get
lubapt
zinterpretować jako wzorzec wyrażenia regularnego. 3)Chociaż można dopasować dowolną ilość dowolnych znaków z
.*
- nie wystarczy*
tylko --you to potrzebne, jeśli wydaje się w środku swojego wyrażenia regularnego. Ponieważ wzorzec jest dopasowywany do dowolnego podciągu nazwy pakietu, nie ma sensu na końcu (lub początku) wzorca.Strona wspomina
^
i$
. Tych (szczególnie^
) są kluczem do pisania bezpiecznych, skutecznych wzorców do użytku zinstall
,remove
lubpurge
działania wapt
lubapt-get
.^
zakotwicza wyrażenie regularne na początku całego łańcucha.^k3b
wybiera wszystkie pakiety, których nazwy zaczynają sięk3b
.$
zakotwicza wyrażenie regularne na końcu całego łańcucha.k3b$
wybrałby wszystkie pakiety, których nazwy kończą się nak3b
.Dlatego możesz użyć tego polecenia, aby bezpiecznie usunąć pakiety:
Wreszcie, w konkretnym przypadku, o którym wspomniałeś, równie dobrze możesz po prostu podać oba nazwiska:
Wtedy unikniesz całej tej złożoności! (Chociaż zakotwiczenie za pomocą
^
jest proste, gdy już się do tego przyzwyczaisz). Lub użyj rozszerzenia nawiasów , które twoja powłoka rozwija do powyższego polecenia:1 Istnieją dwa wyjątki to: (a) niektóre opcje (np
-f
,--purge
) są rozpoznawane i (b) niektóre znaki interpunkcyjne pojawiające się na końcu argumentu, które byłyby uznawane za nazwę pakietu wykonywać działania mogą być służy do zmiany tego, co zostało zrobione (np.sudo apt install ubuntu-desktop^
instaluje zadanie zamiast pakietu i kiedy^
pojawia się na końcu).2 Istnieją inne metaznaki wyrażeń regularnych. Na przykład
\
jest obsługiwany przez wszystkie dialekty wyrażeń regularnych i powszechnie używane..
,?
,+
,*
,|
,[
,^
, I$
po prostu stało się metaznaki apt deweloperzy zdecydowali spowodowałaby interpretację jako wyrażenie regularne (po ustąpieniu jako dokładnym pakiecie o nazwie nie udało).3 Najłatwiejszym sposobem sprawdzenia tego jest symulacja instalacji lub usunięcia z takim wzorcem, przy użyciu
-s
opcji opisanej powyżej. Na przykład uruchamianieapt -s install ^virtualbox
programów,sudo apt install ^virtualbox
które skutkowałyby próbą zainstalowania każdego pakietu, o którym menedżer pakietów wie, od którego imienia zaczyna się nazwavirtualbox
. To zachowanie można jednak również zweryfikować, sprawdzając kod źródłowy . SprawdźCacheSetHelper::PackageFromRegEx
funkcję wcacheset.cc
.źródło
Prawdopodobnie usuniesz bibliotekę zawierającą k3b, od której zależały te programy.
Krótko mówiąc, możesz nigdy nie wiedzieć. Odradzam używanie symboli wieloznacznych do usuwania rzeczy i czytania ich po wyświetleniu monitu (przepraszam).
Również bez opcji -n wyrażenia regularne używają wszystkich pól, a nie tylko nazw
http://ccrma.stanford.edu/planetccrma/man/man8/apt-cache.8.html
również qbi jest poprawne, twoje wyrażenie regularne jest wadliwe od samego początku
źródło
apt-get remove
, tylko przezapt-get cache
. Wygląda na to, że tak naprawdęapt-get remove
szuka tylko nazw pakietów, a nie opisów.