Liệt kê các phụ thuộc (đệ quy) của các gói được cài đặt trong APT


17

Đối với mỗi gói tôi đã cài đặt, tôi muốn biết gói nào sẽ được cài đặt nếu tôi gỡ cài đặt. Một ví dụ về đầu ra tôi cần là ( package: list of deps):

abc: foo bar
bcd: baz abc
bdd: baz fuubar

Nối

Nếu tôi kiểm tra những gì thực sự sẽ được gỡ bỏ nếu tôi gỡ bỏ gói pppbằng cách sử dụng apt-get:

$ echo $(apt-get --dry-run remove ppp | grep '^Remv ' | cut -d' ' -f2)
gnome-ppp mint-meta-xfce network-manager-pptp-gnome network-manager-pptp wvdial pppoeconf pppoe pptp-linux pppconfig ppp

Tôi thấy rằng nó khác với những gì apt-cachechương trình mang lại cho tôi (mà tôi không nghĩ bao gồm các phụ thuộc đệ quy):

$ apt-cache show ppp | grep '^Breaks: '
Breaks: network-manager (<= 0.8.0.999-1), network-manager-pptp (<= 0.8.0.999-1), pppdcapiplugin (<= 1:3.9.20060704+dfsg.1-1)

Nối 2

dpkg --get-selections | cut -f1một cách đáng tin cậy để có được một danh sách các gói đã cài đặt để lặp đi lặp lại?


1
Phân tích cú pháp apt-get --dry-run removevề cơ bản là đúng. Nó có thể bỏ lỡ một số gói được cài đặt tự động chỉ cần cho các gói được cài đặt tự động chỉ cần gói bạn loại bỏ. Có phải đó là lý do tại sao bạn không coi đó là một câu trả lời phù hợp?
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


11

Bạn đã hỏi một vài câu hỏi khác nhau ở đây, tôi hy vọng tôi ít nhất có thể giúp đỡ về một hoặc hai.

Để liệt kê tất cả các gói đã cài đặt, sử dụng dpkgđể xuất trong danh sách trường tách biệt

dpkg -l 

Để chỉ nhận danh sách gói, không có các trường bổ sung, vì vậy bạn có thể đặt nó ở nơi khác.

dpkg -l | awk '{print $2 }' # Pipe to grep after the awk, or glob from dpkg

Ví dụ: nếu tôi muốn xóa kernel cũ,

apt-get purge `dpkg -l linux* | awk '{print $2}' | grep 3.0.0-12`

Cách dễ nhất để đi qua tất cả các phụ thuộc không cần thiết, là với debfoster. Nó chạy tương tác và đi qua những gì bạn muốn, phụ thuộc của họ và có thể loại bỏ hoặc liệt kê những gì không phải là phụ thuộc đệ quy.

Để liệt kê tất cả các phụ thuộc đệ quy của một gói cụ thể,

debfoster -d $PACKAGE ## PACKAGE is the specific package.

Sau khi bạn đã thực hiện, debfosterbạn có thể kiểm tra bất kỳ người phụ thuộc nào mà gói cũng có,

debfoster -e $PACKAGE ## PACKAGE is the specific package.

Một cách thực sự tuyệt vời để liệt kê các gói 'mồ côi' là với deborphan. Chạy deborphanmà không có tùy chọn, và nó sẽ liệt kê tất cả các gói 'mồ côi'. Một 'đứa trẻ mồ côi' là một gói không có gì phụ thuộc và bạn chưa cài đặt rõ ràng.

Tôi cũng thích dọn dẹp mọi gói 'mồ côi' sau khi cài đặt mới. Sau khi tôi đã xóa các gói cụ thể, bạn có thể nhận được bất cứ điều gì bị bỏ qua apt-get autoremove --purgevới,

apt-get purge `deborphan`

Cuối cùng, đôi khi bạn không --purgevà kết thúc với gói 'thức ăn thừa', các phiên bản mới hơn apt-getcó thể tự động loại bỏ chúng. Để xóa tất cả 'phần còn lại' khỏi các gói đã gỡ cài đặt,

apt-get autoclean

Nếu bạn không có phiên bản mới apt-get, bạn luôn có thể xóa chúng bằng các lệnh này. Họ lỗi nếu không có tệp 'còn sót lại', có vẻ như autoclean có thể bỏ lỡ đôi khi bất kể.

dpkg --list |grep "^rc" | cut -d " " -f 3 | xargs dpkg --purge

debfoster vẫn tồn tại, nhưng được coi là thay thế bởi các tính năng trong năng khiếu
Joshua Clayton

4
apt-cache show pkgname1 pkgname2...

sẽ (trong số những thứ khác) liệt kê những phụ thuộc (thời gian chạy) này. Điều này thường là đủ, trừ khi bạn đang cho nó vào máy để xử lý tiếp. Nếu bạn muốn nó ở chính xác định dạng bạn đã nêu, có thể bạn sẽ phải viết một tập lệnh.


Xin lỗi, tôi đặt câu hỏi của tôi không chính xác. Tôi muốn biết gói nào sẽ được gỡ cài đặt cho mỗi gói tôi đã cài đặt. Và tôi cũng cần liệt kê tất cả các gói tôi đã cài đặt.
Đã xóa

2
@ Đã xóa: Xin lỗi, tôi đã không thấy bình luận này cho đến bây giờ. Để đáp ứng với "gói nào sẽ được gỡ cài đặt cho mỗi gói tôi đã cài đặt" (tôi giả sử bạn muốn câu hỏi này được trả lời trên cơ sở mỗi gói) hãy thử apt-get remove -s packagename. Liệt kê tất cả các gói bạn đã cài đặt chỉ là dpkg -l.
Faheem Mitha

@FaheemMitha: bài cũ, nhưng vẫn là mẹo tuyệt vời apt-get remove -s packagename!
twan163

@ twan163 Rất vui vì nó hữu ích cho bạn.
Faheem Mitha

1

Tôi nghĩ rằng bạn phải tiếp tục và tạo ra một vòng lặp cho điều tương tự:

apt-cache depends libtext-wrapi18n-perl |xargs apt-cache depends

Tất nhiên loại bỏ các tiêu đề.


2
apt-cache phụ thuộc vào tùy chọn recuresapt-cache depends --recurse libtext
Joshua Clayton
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.