Letzte Nacht habe ich versucht, CDs zu brennen. Als ich mich über k3b ärgerte und stattdessen brasero auswählte, entfernte ich k3b.
Ich tippte ein:
sudo apt-get remove k3b
Ich drückte zweimal die Tabulatortaste und sah, dass ich sowohl k3b- als auch k3b-Daten auf meinem System hatte. Unter der Annahme, dass ich ohne k3b keine k3b-Daten auf meinem System benötige, wollte ich diese auch entfernen und gab Folgendes ein:
sudo apt-get remove k3b*
Leider drücke ich Y, um zu bestätigen, ohne zu schauen. Es hat viel mehr deinstalliert als k3b
und k3b-data
. Es deinstallierte Pakete, die nicht zu meinem k3b*
regulären Ausdruck passten . Zum Beispiel: transmission
und network-manager
.
Ich bin ziemlich sicher , dass ich nicht einen Raum zwischen habe k3b
und , *
aber ich weiß nicht , warum sonst würde es entfernen , dass es tut. Gibt es etwas an apt-get, das ich missverstehe?
quelle
Antworten:
Der gewünschte Befehl lautet
sudo apt-get remove '^k3b.*'
, weil:.*
mit jedem Zeichen übereinstimmen, und zwar beliebig oft^
mit dem Anfang der Zeichenfolge übereinstimmen*
als Platzhalter interpretiert wird(Diese Antwort vervollständigt und fasst die vorherigen Informationen von qbi und Flimm zusammen.)
quelle
.*
. Sie können nur verwendensudo apt-get remove ^k3b
. Das Vorhandensein von^
ausreichend ist , um zu bewirken , dass das Argument als regulärer Ausdruck interpretiert werden, und wennapt
oderapt-get
interpretiert ein Argument als regulären Ausdruck, sie paßt es überall in dem Paketnamen. Aus diesem Grund müssen Sie^
--den Treffer am Anfang des Paketnamens verankern . Der reguläre Ausdruck muss nicht mit dem gesamten Paketnamen übereinstimmen, sondern nur mit einem Teil davon.^
, dann brauchen Sie nicht.*
)Der reguläre Ausdruck
*
steht für Null oder beliebig viele. Also hast du gesagtapt-get
, dass du alles entfernen sollst , was enthält,k3
gefolgt von einer beliebigen Anzahl vonb
, also im Grunde alles, was enthältk3
. Wenn ich Ihren Befehl auf meinem System ausprobiere, möchte es 58 Pakete entfernen.quelle
*
funktioniert als Platzhalter für Bash wie in DOS, aber einige Befehle wieapt-get
erwarten einen regulären Ausdruck. Bei dersudo apt-get remove -s k3b*
Eingabe sucht bash zuerst nach allen Dateien in Ihrem aktuellen Verzeichnis, die mit beginnenk3b
. Wenn es welche findet, wird es dieses Argument durch diese Dateinamen ersetzen. Wenn nicht, wird esk3b*
direkt an übergebenapt-get
, was es als regulären Ausdruck interpretiert. Wenn Sie nicht möchten, dass bash das Sternchen zuerst als Platzhalter interpretiert (was Sie wahrscheinlich nicht tun), setzen Sie das Argument in einfache Anführungszeichen:sudo apt-get remove -s 'k3b*'
sudo apt-get remove -s 'k3b.*'
. Bin nur auf diese Antwort gestoßen und finde es wirklich wichtig zu wissen. IMHO ist dies ziemlich unerwartet und ich würde es als "unerwartetes Verhalten" Fehler von apt-get markieren ... Sie erwarten normalerweise eine "glob" Bedeutung und keine "regexp" Bedeutung, wenn nicht angegeben. Trotzdem danke und +1!-s
Option bedeutet "Simulation". Es wird angezeigtapt-get
, die Operation nicht auszuführen, sondern Sie lediglich darüber zu informieren, was ohne die-s
Option geschehen würde .Verwenden Sie
sudo apt-get remove ^k3b
stattdessen. Wenn Sie Pakete installieren oder entfernen,*
ist dies häufig gefährlich und wird selten benötigt. Wenn Sie es verwenden*
, sollten Sie es zitieren, aber das macht es nicht sicherer, da seine Tendenz, weit mehr Pakete auszuwählen, als Sie beabsichtigen, das Ergebnis der Artapt
und Weise und derapt-get
Interpretation ist und keine Auswirkung der Pfadnamenerweiterung .*
sind oftmals nicht erforderlich .k3b*
wird jedes Paket entfernt, dask3
irgendwo in seinem Namen enthalten ist (und jedes Paket, das von einem solchen Paket abhängt). Das ist kein Tippfehler -k3
es reicht aus, auch ohne dasb
, denn esb*
bedeutet "null oder mehrb
s".Wenn Sie laufen
apt
oderapt-get
mit deminstall
,remove
oderpurge
Action, jede nachfolgende Argument ist zunächst 1 als Name eines einzelnen Pakets interpretiert. Wenn ein Paket mit diesem genauen Namen vorhanden ist, wird die Aktion für dieses Paket ausgeführt.Wenn es kein solches Paket,
apt
undapt-get
prüft , ob das Argument eine der gemeinsamen enthält regulären Ausdruck Metazeichen 2.
,?
,+
,*
,|
,\[
,^
, oder$
. Wenn nicht, ist es geschafft - es wurde kein Paket gefunden.Wenn es nicht eine dieser Zeichen enthält, dann wird er als regulärer Ausdruck behandelt und gegen abgestimmt jeden Teil eines Paketnamen. Es muss nicht mit dem ganzen Namen übereinstimmen. Wie andere gesagt haben, bedeutet
*
ein regulärer Ausdruck nicht dasselbe wie*
ein Globus.?
tut es auch nicht. In einem regulären Ausdruck:*
Ermöglicht, dass das vorherige Element beliebig oft angezeigt wird - einschließlich nur einmal oder überhaupt nicht - und nicht genau einmal.?
macht das vorherige Element optional - das heißt, es lässt zu, dass es null oder einmal erscheint.apt-get (8) (
man apt-get
) sagt:Die Manpage nur erwähnt
.
,?
und*
, aber es ist unvollständig , wie+
,|
,[
,^
, und$
ist auch ausreichend zu lassenapt-get
oderapt
das Muster als regulärer Ausdruck interpretiert. 3Obwohl Sie eine beliebige Anzahl von Zeichen mit
.*
- nicht nur -*
übereinstimmen können, benötigen Sie dies nur, wenn es in der Mitte Ihres regulären Ausdrucks erscheinen würde. Da das Muster mit einer beliebigen Teilzeichenfolge eines Paketnamens abgeglichen wird, ist es am Ende (oder am Anfang) des Musters sinnlos.Die Manpage erwähnt
^
und$
. Diese (vor allem^
) sind die Schlüssel zum Schreiben von sicheren, effizienten Mustern für die Verwendung mit deninstall
,remove
oderpurge
Aktionen inapt
oderapt-get
.^
Verankert einen regulären Ausdruck am Anfang der gesamten Zeichenfolge.^k3b
wählt alle Pakete , deren Namen beginnen mitk3b
.$
Verankert einen regulären Ausdruck am Ende der gesamten Zeichenfolge.k3b$
würde wählen Sie alle Pakete , deren Namen enden mitk3b
.Daher können Sie diesen Befehl verwenden, um die Pakete sicher zu entfernen:
Schließlich können Sie in dem von Ihnen erwähnten speziellen Fall auch beide Namen selbst übergeben:
Dann vermeiden Sie diese Komplexität! (Obwohl das Verankern mit
^
einfach ist, wenn Sie es gewohnt sind.) Oder verwenden Sie die Klammererweiterung , die Ihre Shell zu dem obigen Befehl erweitert:1 Es gibt zwei Ausnahmen: (a) einige Optionen (zB
-f
,--purge
) werden erkannt, und (b) einige Satzzeichen auf dem erscheinende Ende eines Arguments , das sonst als Paketnamen genommen würde , um die Aktion auszuführen , kann sein wird verwendet, um zu ändern, was getan wird (z. B.sudo apt install ubuntu-desktop^
installiert die Task anstelle des Pakets und wann^
am Ende angezeigt wird).2 Andere Metazeichen für reguläre Ausdrücke sind vorhanden. Zum Beispiel
\
wird von allen Dialekten regulärer Ausdrücke unterstützt und häufig verwendet..
,?
,+
,*
,|
,[
,^
, Und$
nur zufällig die Metazeichen werden der APT - Entwickler als regulärer Ausdruck auslösen würde Interpretation entschieden (nach Auflösung als exaktes Paket mit dem Namen ausgefallen ist ).3 Der einfachste Weg, dies zu überprüfen, besteht darin, die Installation oder Deinstallation mit einem solchen Muster zu simulieren. Verwenden Sie dazu die
-s
oben beschriebene Option. Wenn Sie beispielsweiseapt -s install ^virtualbox
Showssudo apt install ^virtualbox
ausführen, wird versucht, jedes Paket zu installieren, über das der Paketmanager weiß, mit wem der Name beginntvirtualbox
. Dieses Verhalten kann jedoch auch durch Untersuchen des Quellcodes überprüft werden . Überprüfen Sie dieCacheSetHelper::PackageFromRegEx
Funktion incacheset.cc
.quelle
Sie entfernen dann wahrscheinlich eine Bibliothek, in der k3b enthalten ist, von der diese Programme abhängen.
Kurz gesagt, Sie werden es vielleicht nie erfahren. Ich empfehle, kein Platzhalterzeichen zu verwenden, um Dinge zu entfernen und zu lesen, wenn Sie dazu aufgefordert werden (Entschuldigung).
Auch ohne die -n Regex-Suche werden alle Felder und nicht nur Namen verwendet
http://ccrma.stanford.edu/planetccrma/man/man8/apt-cache.8.html
Auch qbi ist korrekt. Ihre Regex ist von Anfang an fehlerhaft
quelle
apt-get remove
nur von erkanntapt-get cache
. Es scheint, dass tatsächlichapt-get remove
nur nach Paketnamen gesucht wird, nicht nach Beschreibungen.