Tadi malam saya mencoba membakar CD. Karena kesal dengan k3b dan memilih untuk menggunakan brasero, saya pergi untuk menghapus k3b.
Saya mengetik:
sudo apt-get remove k3b
Saya menekan tab dua kali dan melihat bahwa saya memiliki data k3b dan k3b pada sistem saya. Dengan asumsi bahwa saya tidak akan memerlukan data-k3b pada sistem saya tanpa k3b, saya ingin menghapusnya juga jadi saya mengetik:
sudo apt-get remove k3b*
Sayangnya saya menekan Y untuk mengkonfirmasi tanpa melihat. Ini menghapus lebih dari k3b
dan k3b-data
. Itu menghapus paket yang tidak sesuai dengan k3b*
regex saya . Misalnya: transmission
dan network-manager
.
Saya cukup yakin bahwa saya tidak memiliki ruang di antara k3b
dan *
tapi saya tidak tahu mengapa lagi itu akan menghapus semua yang dilakukannya. Apakah ada sesuatu tentang apt-get yang saya salah pahami?
sumber
Jawaban:
Perintah yang Anda inginkan adalah
sudo apt-get remove '^k3b.*'
, karena:.*
mencocokkan karakter apa pun, berapa kali^
mencocokkan awal string*
sebagai wildcard(Jawaban ini melengkapi dan merangkum info sebelumnya yang diberikan oleh qbi dan Flimm)
sumber
.*
. Anda bisa menggunakannyasudo apt-get remove ^k3b
. Kehadiran^
cukup untuk menyebabkan argumen ditafsirkan sebagai ekspresi reguler, dan ketikaapt
atauapt-get
menafsirkan argumen sebagai ekspresi reguler, itu cocok dengan itu di mana saja dalam nama paket. Itu sebabnya Anda perlu^
-to jangkar pertandingan ke awal nama paket. Ekspresi reguler tidak perlu cocok dengan seluruh nama paket, sembarang bagian dari itu.^
, maka Anda tidak perlu.*
)Ekspresi reguler
*
adalah nol atau banyak sembarang. Jadi Anda diberitahuapt-get
untuk menghapus apa pun yang berisik3
diikuti oleh sejumlahb
, jadi pada dasarnya semua yang berisik3
. Jika saya mencoba perintah Anda di sistem saya, ia ingin menghapus 58 paket.sumber
*
bekerja sebagai wildcard untuk bash seperti di DOS, tetapi beberapa perintah sepertiapt-get
mengharapkan regex. Saat Anda mengetiksudo apt-get remove -s k3b*
, bash pertama-tama akan mencari file apa pun di direktori Anda saat ini yang dimulai dengank3b
. Jika ditemukan, itu akan menggantikan argumen itu dengan nama file itu. Jika tidak, itu akan diteruskank3b*
langsung keapt-get
, yang akan menafsirkannya sebagai regex. Jika Anda tidak ingin bash menginterpretasikan asterisk sebagai wildcard terlebih dahulu (yang mungkin tidak Anda lakukan), tutup argumen dengan tanda kutip tunggal, seperti ini:sudo apt-get remove -s 'k3b*'
sudo apt-get remove -s 'k3b.*'
. Baru saja menemukan jawaban ini dan merasa sangat penting untuk mengetahuinya. IMHO ini cukup tak terduga dan saya akan menandainya sebagai bug "perilaku tak terduga" apt-get ... Anda biasanya mengharapkan arti "glob" dan bukan makna "regexp" jika tidak ditentukan. Terima kasih dan +1!-s
opsinya berarti "simulasi". Ia memberi tahuapt-get
untuk tidak melakukan operasi, tetapi hanya untuk memberi tahu Anda tentang apa yang akan terjadi tanpa-s
opsi.Gunakan
sudo apt-get remove ^k3b
sebagai gantinya. Ketika Anda menginstal atau menghapus paket,*
seringkali berbahaya dan jarang dibutuhkan. Jika Anda menggunakannya*
, Anda harus mengutipnya, tetapi itu tidak membuatnya lebih aman, karena kecenderungannya untuk memilih paket yang jauh lebih banyak daripada yang Anda inginkan adalah hasil dari caraapt
danapt-get
menafsirkannya dan bukan efek dari ekspansi pathname .*
yang sering tidak perlu .k3b*
Menghapus setiap paket yang berisik3
mana saja dalam namanya (dan setiap paket yang tergantung pada paket tersebut). Itu bukan salah cetak yangk3
cukup, bahkan tanpab
, karenab*
berarti "nol atau lebihb
."Ketika Anda menjalankan
apt
atauapt-get
denganinstall
,remove
ataupurge
tindakan, setiap argumen berikutnya adalah pertama 1 ditafsirkan sebagai nama paket individu. Jika paket dengan nama persis itu ada, tindakan dilakukan untuk itu.Jika tidak ada paket seperti itu,
apt
danapt-get
akan memeriksa apakah argumen mengandung salah satu umum ekspresi reguler metakarakter 2.
,?
,+
,*
,|
,\[
,^
, atau$
. Jika tidak, sudah selesai - tidak ada paket yang ditemukan.Jika memang mengandung salah satu karakter tersebut, maka itu diperlakukan sebagai ekspresi reguler dan cocok dengan bagian mana pun dari nama paket apa pun. Itu tidak harus cocok dengan seluruh nama. Seperti yang dikatakan orang lain,
*
dalam ekspresi reguler tidak berarti sama dengan*
di bola.?
juga tidak. Dalam ekspresi reguler:*
memungkinkan item sebelumnya muncul beberapa kali - termasuk hanya sekali atau tidak sama sekali - bukannya tepat sekali.?
menjadikan item sebelumnya opsional --yaitu, memungkinkan item muncul nol atau satu kali.apt-get (8) (
man apt-get
) mengatakan:Manual ini hanya menyebutkan
.
,?
, dan*
, tapi itu tidak lengkap , seperti+
,|
,[
,^
, dan$
juga cukup untuk membiarkanapt-get
atauapt
menafsirkan pola sebagai ekspresi reguler. 3Meskipun Anda dapat mencocokkan sejumlah karakter apa pun dengan
.*
- bukan hanya - Anda*
hanya memerlukan ini jika itu akan muncul di tengah ekspresi reguler Anda. Karena polanya cocok dengan substring apa pun dari nama paket, itu tidak ada gunanya di akhir (atau awal) dari pola.Halaman manual menyebutkan
^
dan$
. Ini (terutama^
) adalah kunci untuk menulis yang aman, pola efisien untuk digunakan denganinstall
,remove
ataupurge
tindakan dalamapt
atauapt-get
.^
jangkar ekspresi reguler ke awal seluruh string.^k3b
memilih semua paket yang namanya dimulai dengank3b
.$
jangkar ekspresi reguler ke akhir seluruh string.k3b$
akan memilih semua paket yang namanya diakhiri dengank3b
.Karena itu Anda dapat menggunakan perintah ini untuk menghapus paket-paket dengan aman:
Akhirnya, dalam kasus spesifik yang Anda sebutkan, Anda mungkin hanya perlu menyampaikan kedua nama itu sendiri:
Maka Anda menghindari semua kerumitan ini! (Meskipun jangkar dengan
^
sederhana setelah Anda terbiasa.) Atau gunakan ekspansi brace , yang shell Anda ekspansi ke perintah di atas:1 Ada dua pengecualian untuk ini: (a) beberapa pilihan (misalnya,
-f
,--purge
) diakui, dan (b) beberapa karakter tanda baca muncul pada akhir dari argumen yang seharusnya dapat diambil sebagai nama paket untuk melakukan tindakan dapat digunakan untuk mengubah apa yang dilakukan (misalnya,sudo apt install ubuntu-desktop^
menginstal tugas daripada paket, dan kapan^
muncul di akhir).2 Metakarakter ekspresi reguler lainnya ada. Misalnya,
\
didukung oleh semua dialek ekspresi reguler dan yang umum digunakan..
,?
,+
,*
,|
,[
,^
, Dan$
hanya terjadi untuk menjadi metakarakter pengembang APT memutuskan akan memicu interpretasi sebagai ekspresi reguler (setelah resolusi sebagai paket yang tepat bernama telah gagal).3 Cara termudah untuk memverifikasi ini adalah dengan mensimulasikan pemasangan atau penghapusan dengan pola seperti itu, menggunakan
-s
opsi seperti dijelaskan di atas. Misalnya, menjalankanapt -s install ^virtualbox
pertunjukan yangsudo apt install ^virtualbox
akan berdampak mencoba menginstal setiap paket yang diketahui oleh manajer paket tentang siapa yang namanya dimulaivirtualbox
. Namun, perilaku ini juga dapat diverifikasi dengan memeriksa kode sumber . PeriksaCacheSetHelper::PackageFromRegEx
fungsi dicacheset.cc
.sumber
Anda lebih mungkin menghapus lib yang memiliki k3b di dalamnya yang menjadi sandaran program-program tersebut.
Singkatnya, Anda mungkin tidak pernah tahu. Saya sarankan tidak menggunakan wildcard untuk menghapus sesuatu dan membaca hal-hal ketika diminta (maaf).
Juga tanpa pencarian -n regex gunakan semua bidang dan bukan hanya nama
http://ccrma.stanford.edu/planetccrma/man/man8/apt-cache.8.html
qbi juga benar regex Anda cacat sejak awal
sumber
apt-get remove
, hanya olehapt-get cache
. Tampaknya sebenarnya,apt-get remove
hanya mencari nama paket, bukan deskripsi.