joker karakter beklenenden daha fazla kaldırıldı iken apt-get remove. neden?


38

Dün gece CD yazmaya çalışıyordum. K3b'ye sinirlenip yerine brasero kullanmayı seçerek k3b'yi çıkarmaya gittim.

Yazdım:

sudo apt-get remove k3b

Sekmeye iki kez bastım ve sistemimde hem k3b hem de k3b verilerinin olduğunu gördüm. Sistemimde k3b verisine k3b verisine ihtiyaç duymayacağımı varsayarak, şunu da yazdım:

sudo apt-get remove k3b*

Ne yazık ki, bakmadan onaylamak için Y'ye bastım. Bu daha bir sürü daha kaldırıldı k3bve k3b-data. k3b*Regex'ime uymayan paketleri kaldırdı . Örneğin: transmissionve network-manager.

Ben arasına boşluk olmadığını eminim k3bve *ama yaptım tüm bu ortadan kaldıracaktır neden başka bilmiyorum. Apt-get hakkında yanlış anladığım bir şey var mı?


Yanıtlar:


38

İstediğiniz komut sudo apt-get remove '^k3b.*', çünkü:

  • .*Herhangi bir karakterle, istediğiniz sayıda eşleştirmeniz gerekir
  • ^Dizenin başlangıcıyla eşleşmeniz gerekir
  • Bash'in *bir joker karakter olarak yorumlanmasını önlemek için regex'i alıntılamanız gerekir.

(Bu cevap qbi ve Flimm tarafından sağlanan önceki bilgileri tamamlar ve özetler)


5
Bu güvenlidir ve kullanmanız tamamdır ama ihtiyacınız yok .*. Sadece kullanabilirsin sudo apt-get remove ^k3b. Varlığı ^argümanın normal bir ifade olarak yorumlanmasına neden olmak için yeterlidir ve bir argümanı normal bir ifade olarak yorumladığında aptveya apt-getyorumladığında , paket adının herhangi bir yerinde bununla eşleşir . Bu yüzden ihtiyacınız - ^eşleşmeyi paket adının başına bağlamak için. Düzenli ifadenin, paketin adının tamamı ile eşleşmesine gerek yoktur, yalnızca bir kısmı bulunur.
Eliah Kagan

1
Ek bilgi için @EliahKagan Thx! (ve gerçekten de, eğer ihtiyaç duyarsan ^, ihtiyacın yok demektir .*)
Boris Dalstein

30

Düzenli ifade *sıfıra ya da isteğe bağlı olarak çoğuna karşılık gelir. Yani anlattı apt-getiçeren bir şey kaldırmak için k3herhangi bir sayıda takip bböylece temelde içeren her şeyi k3. Komutumu sistemimde denersem, 58 paketi kaldırmak istiyor.

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.

öf! Çok uzun zamandır bu lanet olası pencere makinelerinde (burada * sadece "ve sonra bir şey" anlamına geliyor) çalışırken sıkıştım!
Steve Goykovich

14
*DOS gibi partisi yüzünden joker olarak çalışır, ancak bazı komutlar gibi apt-getbir regex bekliyoruz. Eğer yazdığınızda sudo apt-get remove -s k3b*, bash ilk başlamak geçerli dizindeki tüm dosyaların arayacaktır k3b. Herhangi birini bulursa, bu argümanı bu dosya isimleri ile değiştirir. Aksi takdirde, k3b*doğrudan kendisine apt-getiletilecektir, ki bu onu bir regex olarak yorumlayacaktır. sudo apt-get remove -s 'k3b*'
Bash'ın

3
Böylece amaçlanan komut olurdu sudo apt-get remove -s 'k3b.*'. Sadece bu cevaba tökezledi ve bilmek gerçekten önemli buluyorum. IMHO bu oldukça beklenmedik bir durumdur ve bunu apt-get'in "beklenmedik bir davranış" hatası olarak işaretlerim ... normalde belirtilmediği sürece "regexp" anlamında değil, "glob" anlamına gelir. Yine de teşekkürler ve +1!
Rmano

1
Ve benim gibi bilmeyenler için: -sseçenek "simülasyon" demektir. apt-getİşlemi gerçekleştirmemeyi, sadece -sseçenek olmadan neler olabileceğini size bildirmeyi söyler .
Boris Dalstein,

Bence dünyayı oluşturmak için tek tırnak kullanmanızın, en azından kuklalarda işe yaramadığını düşünüyorum. Ve bu ise beklenmedik. 'Bul' programında eğer bul / -iname 'projesini yazarsam *' Proje ile başlayan her şeyi bulacağım, içinde 'projesi' olan bir şeyi değil, daha sonra bir şeyini bulacağım. Kukla ile ilgili kanıt olarak, sonuçlarımın "regex" dediğini ve sonuçların nasıl kanıtlandığını fark edin.
Dennis

9

Yerine sudo apt-get remove ^k3bkullanın. Paketleri kurarken veya kaldırırken *, çoğu zaman tehlikelidir ve nadiren gereklidir. Eğer kullanımını yaparsanız *, bunu anlatmalısın, ama bu yok değil onun eğilim Yol sonucudur niyetinde çok daha fazla paket seçmek için, çünkü daha güvenli hale getirmek aptve apt-getbunu yorumlamak ve olmayan bir etkiye yol adı genişleme .

  • Hatta güvenli kullanımları* vardır genellikle gereksiz .
  • Güvenli olmayan kullanımlar acımasızdır . Çıkarma , adında herhangi bir yerde bulunan her paketi (ve böyle bir pakete bağlı olan k3b*her paketi) kaldırır . Bu bir yazım hatası içermeyen - yeterli olmasa bile, yeterlidir , çünkü "sıfır veya daha fazla s " anlamına gelir .k3 k3bb*b

Eğer çalıştırdığınızda aptveya apt-getbirlikte install, removeya da purgeeylem, sonraki her argüman ilk 1 bireysel paketin adı olarak yorumlanır. Bu adı taşıyan bir paket varsa, bunun için eylem gerçekleştirilir.

Orada böyle bir pakettir, varsa aptve apt-getargüman ortak birini içeriyorsa kontrol edecek düzenli ifade metakarakterleriyle 2 . , ?, +,* , |, \[, ^, veya$ . Değilse, yapılır - hiçbir paket bulunamadı.

O takdirde gelmez bu karakterlerden birini içermediğinden, o zaman bir düzenli ifade olarak ele alınır ve karşılaştırıldıkça herhangi bir bölümünü herhangi bir paket adının. Bütün isimle eşleşmek zorunda değil. Diğerlerinin dediği gibi, *düzenli ifadelerde, *glob ile aynı anlama gelmez . ?ya da değil. Düzenli bir ifadede:

  • *bir önceki öğenin tam olarak bir kez değil, yalnızca bir kez veya hiç olmaması gibi birçok kez görünmesine izin verir .
  • ?önceki öğeyi isteğe bağlı yapar - bu , sıfır veya bir kez görünmesini sağlar.

apt-get (8) ( man apt-get) diyor ki:

Hiçbir ifade verilen ifadeyle eşleşmiyorsa ve ifade '.', '?' İfadelerinden birini içeriyorsa veya '*' sonra POSIX düzenli ifadesi olduğu varsayılır ve veritabanındaki tüm paket adlarına uygulanır. Herhangi bir eşleşme daha sonra kurulur (veya kaldırılır). Eşleştirmenin 'lo. *', 'how-lo' ve 'en düşük' değerleriyle eşleştiğini unutmayın. İstenmiyorsa, normal ifadeyi '^' veya '$' karakteriyle tutturun veya daha özel bir düzenli ifade oluşturun.

Manpage sadece söz ., ?ve *ancak bu eksik olarak +, |, [, ^, ve $ayrıca izin için yeterli olan apt-getveya aptbir normal ifade olarak desen yorumlar. 3

Eğer herhangi bir karakter herhangi bir sayıda maç rağmen .*- değil sadece *o görünecek sorun olmaz yalnızca bu ihtiyaç ortadan düzenli ifadenin. Desen, bir paket adının herhangi bir alt dize ile eşleştirildiği için, desenin sonunda (veya başında) anlamsızdır.

Manpage ^ve$ . Bunlar (özellikle ^) ile kullanılmak üzere güvenli, verimli desenleri yazma anahtarıdır install, removeya purgeiçinde eylemler aptveya apt-get.

  • ^Tüm dizenin başına düzenli bir ifade tutturur . ^k3bİsimleri bütün paketleri seçer başlatmak ile k3b.
  • $Dize sonuna kadar düzenli bir ifade tutturur . k3b$İsimleri bütün paketleri seçecek sona ile k3b.

Bu nedenle, paketleri güvenle kaldırmak için bu komutu kullanabilirsiniz:

sudo apt-get remove ^k3b

Son olarak, bahsettiğiniz özel durumda, her iki adı da kendiniz de iletebilirsiniz:

sudo apt-get remove k3b k3b-data

O zaman tüm bu karmaşıklığı önlemek! (Buna alışınca bir ^kere bağlantı yapmak basit olsa da.) Veya kabuğunuzun yukarıdaki komuta genişlediği ayraç genişletmesini kullanın:

sudo apt-get remove k3b{,-data}

1 iki istisnası Buna vardır: (a) bazı seçenekler (örneğin -f, --purge) edilmesiyle, ve (b) ' de görünen bazı noktalama karakterleri sonuna aksi olabilir eylemi gerçekleştirmek için bir paket adıyla alınacaktı bir argüman ne yapıldığını değiştirmek için kullanılır (örneğin, paket yerine görevisudo apt install ubuntu-desktop^ yükler ve sonunda göründüğünde).^

2 Diğer düzenli ifade meta karakterleri var. Örneğin, \düzenli ifadelerin tüm lehçeleri tarafından desteklenir ve yaygın olarak kullanılır. ., ?, +, *, |, [, ^, Ve $sadece APT geliştiriciler normal ifade olarak yorumlanmasını tetikleyecek karar meta olarak gerçekleşmesi (adında tam bir paket olarak vereceği karar sonrasında başarısız).

3 Bunu doğrulamanın en kolay yolu -s, yukarıda açıklanan seçeneği kullanarak böyle bir desenle kurulum veya sökmeyi simüle etmektir . Örneğin, çalıştırma apt -s install ^virtualbox, sudo apt install ^virtualboxpaket yöneticisinin adı kiminle başladığını bildiği her paketi yükleme girişiminde bulunma etkisinin olacağını gösterir virtualbox. Ancak, bu davranış kaynak kodunu inceleyerek de doğrulanabilir . CacheSetHelper::PackageFromRegExİşlevini kontrol et cacheset.cc.


1

Büyük olasılıkla, bu programların bağlı olduğu k3b içeren bir lib'i kaldırmanız muhtemeldir.

Kısacası asla bilemeyebilirsin. Bir şeyleri silmek ve istendiğinde bir şeyler okumak için joker karakter kullanmamanızı öneririm (üzgünüm).

Ayrıca dışarı -n regex aramaları sadece isimleri değil tüm alanları kullanır

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

ayrıca qbi doğrudur, regex'inizin yanlış gittiği


Başka bir şey, seninki gibi durumlarda (k3b ve k3b verileri) sadece apt-get uninstall k3b. Apt, daha sonra gerekmeyen şeylerin kurulu olup olmadığını ve bunları kaldırmak için yapmanız gerekenleri size bildirecektir.
coteyr

Vaov! Onun da açıklamaları içinde arama yapmasını beklemiyordum! evet, bu kesinlikle bir daha asla yapmayacağım bir şey! (ve bir dahaki sefere şeyler okumak emin olacağım: P)
Steve Goykovich

Bağlantı koptu, -n'nin nasıl kullanılacağına açıklık getirir misiniz?
Seanny123 17:13

-n sadece isimler alanında arama yapmak anlamına gelir.
coteyr

Denedikten sonra, -n seçeneği apt-get removesadece tarafından tanınmaz apt-get cache. Aslında, apt-get removeaçıklamaları değil , sadece paket adlarını arar gibi görünüyor.
Boris Dalstein
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.