Làm cách nào để xóa tất cả các gói khớp với một mẫu nhất định?


26

Tôi muốn gỡ cài đặt libreoffice. Chương trình này bao gồm khoảng ba chục mô-đun. Lý tưởng nhất, chúng có thể được gỡ bỏ bằng:

aptitude remove libreoffice3.6* libreoffice-debian-menus libobasis3.6-*

nhưng thất bại với

Couldn't find any package whose name or description matched "libreoffice3.6*"

v.v.

Làm cách nào để xóa một tập hợp các gói theo mẫu?

PS: Tôi rất vui về câu trả lời khi sử dụng dpkghoặc apt, quá


Bạn đang cố gắng để biết câu trả lời về mẫu nhất định hoặc hài lòng với việc loại bỏ các thành phần LibreScript?
Anwar

1
có thể trùng lặp Làm thế nào để gỡ cài đặt LibreOffice? Câu trả lời là probabaly: điều này chỉ hoạt động cho 3.6 và bạn không sử dụng 3.6 :-)
Rinzwind

Tôi đang sử dụng libreoffice làm ví dụ vì nó chứa rất nhiều phần. Nhưng tôi gặp vấn đề tương tự với kernel (dọn dẹp các phiên bản cũ)
Aaron Digulla

Câu trả lời:


26
  1. Sử dụng apt-get, không aptitude, và sử dụng các biểu thức thông thường.

  2. Trong một biểu thức chính quy, .có nghĩa là bất kỳ ký tự nào, và *có nghĩa là 0 hoặc nhiều lần. Vì vậy, biểu thức libreoffice.*khớp với bất kỳ tên gói nào chứa chuỗi libreoffice, theo sau là bất kỳ số lượng ký tự nào.

  3. Bao quanh biểu thức chính quy với các dấu ngoặc đơn để tránh shell diễn giải dấu hoa thị. (Nếu bạn có một tệp có tên libreoffice.exampleví dụ trong thư mục hiện tại của bạn, trình bao sẽ thay thế libreoffice.*bằng libreoffice.example, vì vậy bạn phải sử dụng dấu ngoặc đơn để dừng hành vi này.)

Kết quả:

sudo apt-get remove 'libreoffice.*'

Cảm ơn, điều này làm việc. Thật thú vị, nó cũng hoạt động với mẫu libreoffice*(tức là mẫu kiểu toàn cầu) làm tôi bối rối một chút vì một trong số chúng không nên hoạt động :-)
Aaron Digulla

3
Đối với những người muốn kiểm tra điều này, hãy sử dụng tùy chọn --dry-runđể xem những gì sẽ bị xóa mà không có bất kỳ thay đổi nào đối với hệ thống.
Aaron Digulla

@AaronDigulla Chưa biết về --dry-run. Điều đó sẽ có ích! Cảm ơn!
Glutimate

apt-get cũng khá tệ khi xử lý các biểu thức chính quy, so sánh cả hai giải pháp trong câu trả lời này .
Braiam

Để làm cho nó rõ ràng, aptsử dụng biểu thức thông thường POSIX. Từ man apt-get(Debian Jessie): "Nếu không có gói nào khớp với biểu thức đã cho và biểu thức có chứa một trong số '.', '?' hoặc '*' thì nó được coi là biểu thức chính quy POSIX ... "
x-yuri

6

Một thay thế là:

dpkg -l | grep libreoffice | awk '{print $2}' | xargs -n1 echo

Điều này sẽ liệt kê ra tất cả các gói phù hợp libreoffice. Khi bạn đã xác nhận rằng tất cả họ là những người bạn muốn loại bỏ, hãy chạy lệnh sau ... một cách thận trọng :

dpkg -l | grep libreoffice | awk '{print $2}' | xargs -n1 sudo apt-get purge -y

Ý tưởng:

  1. Nhận hệ thống để liệt kê tất cả các gói đã cài đặt
  2. Bộ lọc để chỉ hiển thị những cái phù hợp libreoffice
  3. Bộ lọc để chỉ hiển thị cột có tên gói
  4. Chạy lệnh thanh trừng trên mỗi gói đó

1
có lẽ bạn có thể đề xuất thêm -ptùy chọn để xargssẽ nhắc xác nhận trước khi thực hiện từng lệnh được xây dựng hoặc kiểm tra trước echothay vìsudo apt-get purge
Zanna

1
@Zanna -psẽ giúp, nhưng nó sẽ không phải là một lệnh một lần. Tôi đã sử dụng echos để kiểm tra những gì tôi nhận được trước khi chạy lệnh, vì vậy đó là giá trị khuyến nghị.
aalaap

2
Tôi có thể cung cấp cho bạn +1 bây giờ bạn đã làm cho nó an toàn hơn :)
Zanna

Tôi nghĩ rằng điều -n1này là tốt cho echonhưng bạn phải loại bỏ nó khỏi cuộc thanh trừng; mặt khác, thứ tự phụ thuộc (a phụ thuộc vào b, cố gắng xóa b trước) có thể phá vỡ sự thanh trừng.
Aaron Digulla

Giải pháp của bạn là tốt nhất tôi tìm thấy cho đến bây giờ, cảm ơn bạn.
João Pedro

5

Aptitude có hỗ trợ cho các mẫu toàn cầu và một kết hợp tuyệt vời khác như thế này:

aptitude remove '?and(?name(libreoffice), name(3.6), ~i)' libreoffice-debian-menus

Điều này sẽ phù hợp với bất kỳ gói có trong nó tên libreoffice3.6và cũng có thể nó đã được cài đặt (đó là những gì các ~iviết tắt cho.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.