ワイルドカードが削除されたapt-get removeは、予想以上に削除されました。どうして?


38

昨夜、CDを焼こうとしていました。k3bに悩まされ、代わりにbraseroを使用することにしたので、k3bを削除しに行きました。

入力したもの:

sudo apt-get remove k3b

タブを2回押すと、システムにk3bとk3b-dataの両方があることがわかりました。k3bがなければシステムにk3b-dataは必要ないと仮定して、それも削除したかったので、次のように入力しました。

sudo apt-get remove k3b*

残念ながら、私はYを押して確認せずに確認しました。これは、以上の全体の多くをアンインストールk3bしてk3b-datak3b*正規表現に適合しないパッケージをアンインストールしました。たとえば、次のようにtransmissionしてnetwork-manager

私は間にスペースを持っていなかったことをかなり確信しているk3b*私はそれはそれがなかったすべてのことを削除する理由他に知りません。apt-getについて誤解していることはありますか?


回答:


38

必要なコマンドはsudo apt-get remove '^k3b.*'、です:

  • .*任意の文字に何度でも一致する必要があります
  • ^文字列の先頭と一致する必要があります
  • bash *がワイルドカードとして解釈されないように正規表現を引用する必要があります

(この回答は、qbiとFlimmによって提供された以前の情報を完了し要約します)


5
これは安全であり、使用しても問題ありませんが、を使用する必要はありません.*。あなただけを使用することができますsudo apt-get remove ^k3b。存在は、^引数が正規表現として解釈させるのに十分である、とする場合aptapt-get、正規表現として引数を解釈し、それに合致する任意の場所にパッケージ名に。そのため、パッケージ名の先頭に一致を固定するために必要^です。正規表現は、パッケージ名全体と一致する必要はなく、その一部のみを一致させる必要があります。
エリアケイガン

1
追加情報は@EliahKagan Thx!(実際、必要な場合は必要ないということは理にかなって^います.*
ボリスダルシュタイン

30

正規表現*は、ゼロまたは任意の多数を表します。だから、語っapt-get含ま何でも削除するには k3、任意の数字が続くbので、基本的には、含まれているすべてのものをk3。私のシステムでコマンドを試してみると、58個のパッケージを削除したいのです。

sudo apt-get remove -s k3b*
Package k3b is not installed, so not removed
Package k3b-data is not installed, so not removed
Package k3b-dbg is not installed, so not removed
Package libcanberra-gtk3-0 is not installed, so not removed
Package libcanberra-gtk3-0-dbg is not installed, so not removed
Package libcanberra-gtk3-dev is not installed, so not removed
…
The following packages will be REMOVED:
  appmenu-gtk ardour audacity brasero brasero-cdrkit firefox-globalmenu
  gconf-editor gir1.2-appindicator-0.1 gnome-applets gnome-control-center
…
0 upgraded, 2 newly installed, 58 to remove and 0 not upgraded.

うん!私はこれらのくっきりとしたWindowsマシン(*は「とそれ以降」を意味します)の作業に長い間立ち往生しています。
スティーブゴイコビッチ

14
*DOSのようにbashのためのワイルドカードとして機能しますが、いくつかのコマンドは好きなapt-get正規表現を期待しています。入力するとsudo apt-get remove -s k3b*、bashはまず、現在のディレクトリ内でで始まるすべてのファイルを探しますk3b。見つかった場合、その引数をそれらのファイル名に置き換えます。そうでない場合は、にk3b*直接渡さapt-getれ、正規表現として解釈されます。:あなたはbashが(おそらくない)最初のワイルドカードとしてアスタリスクを解釈したくない場合は、次のように、単一引用符で引数を囲むsudo apt-get remove -s 'k3b*'
Flimm

3
したがって、意図されたコマンドはそうであったでしょうsudo apt-get remove -s 'k3b.*'。この答えにつまずいただけで、知ることが本当に重要だとわかりました。私見これは非常に予想外であり、私はそれをapt-getの「予期しない動作」バグとしてマークします...通常、「regexp」の意味ではなく「glob」の意味を期待します。とにかくありがとう、+ 1!
Rmano

1
そして、私が知らなかった人にとっては、この-sオプションは「シミュレーション」を意味します。apt-get操作を実行しないで、-sオプションなしで何が起こるかを単に通知するように指示します。
ボリスダルシュタイン14

グロペットを作成するための単一引用符の使用は、少なくとも人形では機能しないと思います。そしてそれ 予想外です。'find'プログラムで、find / -iname 'project *'と書くと、 'project'を含むものではなく、projectで始まるすべてのものを検索します。人形に関する証拠として、私の結果が「正規表現」と言っていることに注目してください。結果はそれを証明していますか?
デニス

9

sudo apt-get remove ^k3b代わりに使用してください。パッケージをインストールまたは削除するとき*は、多くの場合危険であり、ほとんど必要ありません。あなたが使用を行う場合*、あなたはそれを引用しなければならないが、それはないではない、その傾向はあなたが道の結果であるつもりよりもはるかに多くのパッケージを選択するので、それはより安全にaptし、apt-getそれを解釈していないの効果パス名展開を

  • さえの安全な使用法は*あるしばしば不要
  • 安全でない使用は残忍です。削除k3b*すると、名前にk3 任意の場所を含むすべてのパッケージ(およびそのようなパッケージに依存するすべてのパッケージ)が削除されます。これはタイプミスではありません。「ゼロ以上のs 」を意味するため、がk3なくても十分です。bb*b

あなたが実行した場合aptまたはapt-getinstallremove、またはpurgeアクション、その後の各引数が最初である1個々のパッケージの名前として解釈します。その正確な名前のパッケージが存在する場合、そのパッケージに対してアクションが実行されます。

そこには、このようなパッケージではありません、場合aptapt-get引数は共通のいずれかが含まれているかどうかを確認します正規表現の メタ文字を2 .?+*|\[^、または$。そうでない場合は完了です。パッケージは見つかりませんでした。

これらの文字含まれている場合、正規表現として扱われ、パッケージ名の任意の部分と照合されます。名前全体と一致する必要はありません。他の人が言ったよう*に、正規表現*ではグロブと同じことを意味しません。?どちらでもありません。正規表現で:

apt-get(8)man apt-get)言う:

指定された式に一致するパッケージがなく、式に「。」、「?」のいずれかが含まれる場合 または「*」はPOSIX正規表現であると想定され、データベース内のすべてのパッケージ名に適用されます。一致したものはすべてインストール(または削除)されます。一致はサブストリングによって行われるため、「lo。*」は「how-lo」および「lowest」に一致することに注意してください。これが望ましくない場合は、正規表現を「^」または「$」文字で固定するか、より具体的な正規表現を作成します。

manページのみ言及し.?*、しかし、それは不完全であるとして、+|[^、と$も聞かせするのに十分であるapt-getか、apt正規表現としてパターンを解釈します。3

あなたが任意の数の任意の文字と一致させることができますが.*- ないだけで*、それはに表示される場合--youにのみ、これを必要とするミドルあなたの正規表現の。パターンはパッケージ名のサブストリングと照合されるため、パターンの最後(または最初)で意味がありません。

manページには言及^して$。これらは、(特に^)で使用するために安全で、効率的なパターンを書き込むの鍵であるinstallremoveまたはpurge内のアクションaptまたはapt-get

  • ^文字列全体の先頭に正規表現を固定します。^k3b名前がすべてのパッケージを選択起動してをk3b
  • $文字列全体の最後に正規表現をアンカーします。k3b$名前は、すべてのパッケージを選択します終わるとをk3b

したがって、このコマンドを使用して、パッケージを安全に削除できます。

sudo apt-get remove ^k3b

最後に、言及した特定のケースでは、両方の名前を自分で渡すこともできます。

sudo apt-get remove k3b k3b-data

次に、この複雑さをすべて回避します!(アンカーは、慣れれ^ば簡単になります。)または、ブレース展開を使用します。これは、シェルが上記のコマンドに展開します。

sudo apt-get remove k3b{,-data}

1 :これには2つの例外があります()いくつかのオプションが(例えば、-f--purge)認識され、および (B)に現れるいくつかの句読点終わりそうでない場合は、アクションを実行するためにパッケージ名として解釈されるだろう引数のが可能に実行内容を変更するために使用されます(たとえば、パッケージではなくタスクをsudo apt install ubuntu-desktop^インストールし、最後にいつ表示されるかなど)。^

2 他の正規表現メタキャラクターが存在します。たとえば\、正規表現のすべての方言でサポートされ、一般的に使用されています。.?+*|[^、と$だけAPT開発者は正規表現として解釈を誘発することを決めたメタ文字であることを起こる(名前の正確なパッケージとして解決した後に失敗しました)。

3 これを確認する最も簡単な方法は、-s上記のオプションを使用して、このようなパターンでインストールまたは削除をシミュレートすることです。たとえば、名前がで始まるパッケージマネージャーが知っているすべてのパッケージをインストールしようとする効果があるapt -s install ^virtualboxショーを実行sudo apt install ^virtualboxvirtualboxます。ただし、この動作はソースコードを調べることでも確認できます。のCacheSetHelper::PackageFromRegEx機能を確認しますcacheset.cc


1

その場合、それらのプログラムが依存しているk3bを含むlibを削除する可能性が高くなります。

要するに、あなたは決して知らないかもしれません。ワイルドカードを使用して物を削除したり、プロンプトが表示されたときに物を読んだりしないことをお勧めします(申し訳ありません)。

また、-n正規表現検索では、名前だけでなくすべてのフィールドが使用されます

http://ccrma.stanford.edu/planetccrma/man/man8/apt-cache.8.html

また、QBIは正しいですあなたの正規表現は始めから欠陥があります


もう1つ、あなたのような場合(k3bおよびk3bデータ)には、単にapt-get k3bをアンインストールします。その後、Aptは、不要になったものがインストールされている場合、およびそれらを削除するために必要なことを通知します。
coteyr

うわー!説明内を検索することも期待していなかったでしょう!ええ、これは間違いなく二度とやりません!(そして、私は次回物事を必ず読むでしょう:P)
スティーブゴイコビッチ

リンクが壊れています。-nの使用方法を明確にしてください。
Seanny123

-nは、名前フィールドでのみ検索することを意味します。
coteyr

試行した後、-nオプションはによって認識されapt-get removeず、によってのみ認識されapt-get cacheます。実際には、apt-get remove説明ではなくパッケージ名のみを検索するようです。
ボリスダルシュタイン14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.