Liệt kê các gói được cài đặt rõ ràng


53

Trong Gentoo có tệp /var/lib/portage/worldchứa các gói mà tôi đã cài đặt rõ ràng. Theo ý tôi, rõ ràng, các gói mà tôi chọn, không bao gồm bất cứ thứ gì được cài đặt theo mặc định hoặc được kéo vào bởi các phụ thuộc.

Có một tệp tương tự hoặc một lệnh để tìm thông tin đó trong Ubuntu không?

Câu trả lời:


46

Chỉ là mã

aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currentlyinstalled.txt
wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest \
  | cut -f1 | sort -u > defaultinstalled.txt
comm -23 currentlyinstalled.txt defaultinstalled.txt

Giải trình

Một cách để suy nghĩ về vấn đề này là chia vấn đề này thành ba phần:

  • Làm thế nào để tôi có được một danh sách các gói không được cài đặt như phụ thuộc?
  • Làm thế nào để tôi có được một danh sách các gói được cài đặt theo mặc định?
  • Làm thế nào tôi có thể nhận được sự khác biệt giữa hai danh sách này?

Làm thế nào để tôi có được một danh sách các gói không được cài đặt như phụ thuộc?

Lệnh sau dường như hoạt động trên hệ thống của tôi:

$ aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currentlyinstalled.txt

Cách tiếp cận tương tự có thể được tìm thấy trong các liên kết mà Gilles đã đăng dưới dạng bình luận cho câu hỏi. Một số nguồn cho rằng điều này sẽ chỉ hoạt động nếu bạn sử dụng năng khiếu để cài đặt các gói; tuy nhiên, tôi gần như không bao giờ sử dụng năng khiếu để cài đặt các gói và thấy rằng nó vẫn hoạt động. Việc --disable-columnsngăn chặn khả năng từ các dòng đệm của tên gói với khoảng trống sẽ cản trở việc so sánh bên dưới. Việc | sort -usắp xếp các tập tin và loại bỏ trùng lặp. Điều này làm cho bước cuối cùng dễ dàng hơn nhiều.

Làm thế nào để tôi có được một danh sách các gói được cài đặt theo mặc định?

Lưu ý: Phần này bắt đầu với một 'đường dẫn sai' mà tôi nghĩ là mang tính minh họa. Đoạn mã thứ hai là mã hoạt động.

Đây là một chút phức tạp hơn. Ban đầu tôi nghĩ rằng một xấp xỉ tốt sẽ là tất cả các gói phụ thuộc vào các gói meta ub Ubuntu-Minimal, ub Ubuntu-standard, ubfox-desktop và các gói liên quan đến kernel linux khác nhau. Một vài kết quả trên các tìm kiếm google dường như sử dụng phương pháp này. Để có danh sách các phụ thuộc này, trước tiên tôi đã thử cách sau (không hoạt động):

$ apt-cache depends ubuntu-desktop ubuntu-minimal ubuntu-standard linux-* | awk '/Depends:/ {print $2}' | sort -u

Điều này dường như bỏ qua một số gói mà tôi biết phải đến theo mặc định. Tôi vẫn tin rằng phương pháp này sẽ hoạt động nếu một người xây dựng đúng danh sách các siêu dữ liệu.

Tuy nhiên, dường như các máy nhân bản Ubuntu chứa tệp "tệp kê khai" chứa tất cả các gói trong cài đặt mặc định. Tệp kê khai cho Ubuntu 12.04.3 có tại đây:

http://mirror.pnl.gov/release/precise/ubfox-12.04.3-desktop-amd64.manifest

Nếu bạn tìm kiếm thông qua trang này (hoặc trang của gương gần bạn hơn):

http://mirror.pnl.gov/release/precise/

Bạn sẽ có thể tìm thấy tệp ".manifest" tương ứng với phiên bản và kiến ​​trúc bạn đang sử dụng. Để chỉ trích xuất tên gói tôi đã làm điều này:

wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest | cut -f1 | sort -u > defaultinstalled.txt

Danh sách có khả năng đã được sắp xếp và duy nhất, nhưng tôi muốn chắc chắn rằng nó đã được sắp xếp hợp lý để làm cho bước tiếp theo dễ dàng hơn. Tôi sau đó đặt đầu ra defaultinstalled.txt.

Làm thế nào tôi có thể nhận được sự khác biệt giữa hai danh sách này?

Đây là phần dễ nhất vì hầu hết các hệ thống giống Unix có nhiều công cụ để làm việc này. Công commcụ này là một trong nhiều cách để làm điều này:

comm -23 currentlyinstalled.txt defaultinstalled.txt

Điều này sẽ in danh sách các dòng duy nhất cho tập tin đầu tiên. Vì vậy, nó nên in một danh sách các gói đã cài đặt không có trong cài đặt mặc định.


Đường ống đầu tiên của bạn làm gì mà aptitude search '~i!~M' -F %pkhông được?
ephemient

@ephemient: Có lẽ không có gì. Tôi không biết nhiều về năng khiếu và do đó đã sử dụng các công cụ mà tôi quen thuộc hơn là tìm hiểu kỹ về tập tin con người của một chương trình tôi không bao giờ sử dụng.
Steven D

1
Bạn phá hủy hy vọng của tôi, tôi nghĩ rằng có một số cách dễ dàng tiêu chuẩn :(
phunehehe

3
Điều này gần như hoạt động, nhưng vẫn không chính xác. Có nhiều gói và thư viện mà tôi chắc chắn không cài đặt được chứa thủ công trong danh sách kết quả. Tôi đã sử dụng http://releases.ubuntu.com/releases/trusty/ubuntu-14.04-desktop-amd64.manifestvà bổ sung | sed "s/ *$//"nhưng vẫn không có xúc xắc.
jmiserez

1
Bước đầu tiên nhận được danh sách các gói không được cài đặt làm phụ thuộc có thể được thay thế bằng apt-mark showmanual | sort -u, như thể hiện trong các câu trả lời khác. Đơn giản hơn và không dựa vào aptitudecái nào không được cài đặt theo mặc định.
skagedal

24

Bạn có thể sử dụng một trong hai lớp lót này. Cả hai đều mang lại cùng một đầu ra trên máy của tôi và chính xác hơn tất cả các giải pháp được đề xuất cho đến bây giờ (tháng 7 năm 2014) trong câu hỏi này. Chúng là sự kết hợp của hai câu trả lời (1)(2) . Lưu ý rằng ban đầu tôi đã đăng câu trả lời này ở đây .

Sử dụng apt-mark:

comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

Sử dụng aptitude:

comm -23 <(aptitude search '~i !~M' -F '%p' | sed "s/ *$//" | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

Rất ít các gói vẫn rơi qua các vết nứt, mặc dù tôi nghi ngờ những đang thực sự được cài đặt bởi người sử dụng, hoặc ngay sau khi quá trình cài đặt thông qua việc thiết lập địa hóa ngôn ngữ hoặc ví dụ như thông qua trình cài đặt Totem codec. Ngoài ra, các phiên bản tiêu đề linux dường như cũng tích lũy, mặc dù tôi chỉ cài đặt siêu dữ liệu không dành riêng cho phiên bản. Ví dụ:

libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29    

Làm thế nào nó hoạt động

  1. Lấy danh sách các gói cài đặt thủ công. Đối với năng khiếu, các seddải bổ sung ra khoảng trắng còn lại ở cuối dòng.
  2. Lấy danh sách các gói được cài đặt ngay sau khi cài đặt mới.
  3. So sánh các tệp, chỉ xuất các dòng trong tệp 1 không có trong tệp 2.

Các khả năng khác cũng không hoạt động:

  • Sử dụng ubuntu-14.04-desktop-amd64.manifesttệp ( ở đây cho Ubuntu 14.04) thay vì /var/log/installer/initial-status.gz. Nhiều gói được hiển thị là cài đặt thủ công mặc dù chúng không phải là.
  • Sử dụng apt-mark showautothay vì /var/log/installer/initial-status.gz. apt-markví dụ không bao gồm gói xserver-xorg, trong khi tệp khác thì có.

Cả hai liệt kê nhiều gói hơn giải pháp trên.


Nếu bạn đã nâng cấp hệ thống của mình kể từ lần cài đặt ban đầu (đó là trường hợp của hầu hết mọi người tôi nghĩ), tốt hơn là sử dụng tệp kê khai của phiên bản phát hành Ubuntu hiện tại của bạn.
Diego V

Nếu bạn đã nâng cấp, tôi nghĩ bạn sẽ cần sử dụng cả hai tệp, không chỉ tệp kê khai. Bạn có thể dễ dàng làm điều đó bằng cách chỉ cần thêm một so sánh khác. Rất tiếc, tệp kê khai không chứa mọi thứ mà tệp init_status.gz thực hiện (tôi đã kiểm tra).
jmiserez

Tôi rất ấn tượng! Tôi tìm thấy một mảnh còn thiếu tuy nhiên. Điều gì về các gói được cài đặt ban đầu nhưng sau đó được gỡ bỏ thủ công , tuy nhiên, sau đó được cài đặt lại một cách rõ ràng bằng tay ? Tôi tìm thấy điều này trong một hệ thống làm việc.
n611x007

1
Tôi đã đưa ra một câu hỏi unix.SE/225330: Liệt kê các gói (apt) bị loại bỏ rõ ràng để giải quyết phần lớn công việc.
n611x007

1
Điều này tốt hơn giải pháp được chấp nhận, vì mirror.pnl.gov/release/precise/ nam URL trong giải pháp được chấp nhận hiện là 404.
rmunn

9

Theo man apt-mark:

apt-mark showauto
apt-mark showmanual

2
showmanualđang hiển thị những thứ như xserver-xorg-video-vesa, mà tôi thề tôi đã không cài đặt thủ công.
phunehehe

có thể được cài đặt tự động bởi distro của bạn ở lần cài đặt đầu tiên.
Matt

8

Đây là một số đầu ra mẫu của cat /var/log/apt/history.log:

Start-Date: 2011-01-22  00:43:38
Commandline: apt-get --target-release experimental install libdbus-1-dev
Upgrade: libdbus-1-3:i386 (1.4.0-1, 1.4.1-1), libdbus-1-dev:i386 (1.4.0-1, 1.4.1-1)
End-Date: 2011-01-22  00:43:48

Start-Date: 2011-01-23  01:16:13
Commandline: apt-get --auto-remove purge webcheck
Purge: python-utidylib:i386 (0.2-6), python-beautifulsoup:i386 (3.1.0.1-2), libtidy-0.99-0:i386 (20091223cvs-1), webcheck:i386 (1.10.3)
End-Date: 2011-01-23  01:16:31

Đối với câu hỏi của bạn, hãy lọc nội dung bằng grep ( cat /var/log/apt/history.log | grep Commandline).

Lưu ý rằng các tệp này được xoay, vì vậy hãy kiểm tra các tệp khác để bạn không bỏ lỡ bất cứ điều gì:

$ ls /var/log/apt/history.log*
-rw-r--r-- 1 root root 69120 2011-01-23 18:58 /var/log/apt/history.log
-rw-r--r-- 1 root root 19594 2011-01-01 02:48 /var/log/apt/history.log.1.gz

LƯU Ý :

  • Tôi đã kiểm tra cả năng khiếukhớp thần kinh (phiên bản 0,700,6.3 ) và cả hai đều ghi nhật ký hoạt động của mình trên tệp nhật ký đó. Một trở ngại với họ là họ không có dòng bắt đầu Commandline, vì vậy grepmánh khóe sẽ không hiệu quả với họ.

2
Giải pháp thú vị. Bạn sẽ cần điều chỉnh lệnh grep một chút để có được danh sách các gói và tính đến các gói được cài đặt bởi aptitudevà các trình quản lý gói khác. Nếu nhật ký của bạn đã quay đi, thì bạn đã hết may mắn.
Steven D

@steven Cập nhật. Grep-fu của tôi là một người mới, vì vậy tôi sẽ để lại cho người đọc. Ngoài ra, tôi không biết nếu thứ đó quay đi. Tôi chỉ phải nộp hồ sơ trong đó.
tshepang

Việc chúng có quay đi hay không sẽ phụ thuộc vào thiết lập logrotate của bạn và thời gian hệ thống của bạn tồn tại. Tôi không chắc về mặc định của Ubuntu vì đã lâu rồi tôi mới thay đổi chúng.
Steven D

7

Tôi đã bắt gặp oneliner xinh đẹp này trong khi tôi đang tìm kiếm truy vấn này

Một lớp lót là

comm -13 \
  <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
  <(comm -23 \
    <(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
    <(apt-mark showauto | sort) \
  )`

Bộ lọc oneliner này được cài đặt bởi hệ thống bằng cách sử dụng nhật ký từ /var/log/installer/initial-status.gz

Tôi sẽ đăng liên kết đến chủ đề ban đầu khi tôi tìm thấy nó, vì oneliner này không phải của tôi và dường như tôi không thể nhớ tôi đã nhìn thấy nó ở đâu.


3

Bạn sẽ muốn có một cái nhìn vào bài viết này .

Cuối bài viết, có một kịch bản python nên làm những gì bạn muốn.

Nó được viết cho (k) ubfox . Nhưng nên hoạt động cho Ubuntu .


3
các liên kết dường như không còn hoạt động.
rog

2
Liên kết bị hỏng như thế này là lý do tại sao việc đưa thông tin liên quan vào câu trả lời của bạn lại quan trọng.
Whitehat101

2

Dưới đây là một bổ sung cho Steven D's câu trả lời .

Dòng sau đây dường như được cắt bớt tên gói ở 32 ký tự:

aptitude search '~i !~M' | cut -d" " -f4 | sort -u > currentlyinstalled.txt

Điều này dường như làm việc:

aptitude search '~i !~M' -F "%p" > sort -u > currentlyinstalled.txt

xem câu trả lời này


1

Thủ tục thanh toán /var/log/apt/term.log


2
đó là một cách khá khó khăn để làm mọi thứ và không có sự phân biệt giữa các gói tôi tự cài đặt và các gói được kéo vào bởi các phụ thuộc
phunehehe

Tôi đồng ý, nhưng tôi không biết rằng apt theo dõi những điều đó: / Bây giờ tôi biết, nhờ Stefan :)
Joril

1

Bạn cũng có thể nhìn vào tập tin /var/lib/apt/extended_states.

cat /var/lib/apt/extended_states | grep -B2 'Auto-Installed: 0'

Điều này rất hữu ích nếu bạn muốn biết những gì đã được cài đặt trên một phân vùng cũ.


0

Xin chân thành cảm ơn và chúc mừng những ai đã nghĩ ra viên ngọc kịch bản đó !!!
Tôi muốn thêm 2 của mình và tôi đã giải quyết ngày cài đặt mà tôi suy ra từ $ thông tin.
Tôi không nắm vững các chi tiết tại sao các tệp thông tin $ được cập nhật hay không và khi nào, nhưng nó hoạt động trong thực tế.
Kịch bản của tôi liệt kê các bản cập nhật mới nhất của các gói không phụ thuộc được thêm vào sau khi cài đặt.
Đưa ra một kiểm tra định kỳ, tôi đã thấy những gì tôi sẽ đăng nhập thủ công mà không bỏ lỡ một lần nào.
Đó là, các lô gói được cài đặt cho cùng một lý do. Thật không may, cập nhật phá vỡ thứ tự đó.
Sau khi nâng cấp hệ thống, tôi đã có một danh sách các gói được thêm vào mà bản nâng cấp không cập nhật theo sau là các gói mà nó đã làm.
Khéo léo! Thưởng thức.

info='/var/lib/dpkg/info/'

comm -13 > /tmp/packages \
  <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
  <(comm -23 \
    <(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
    <(apt-mark showauto | sort) \
  )

while read n; do
  echo $(ls -ltr --time-style=long-iso $info$n.* $info$n:i386.* $info$n:amd64.* 2>/dev/null \
    | tail -n 1 | perl -pe 's/.*([0-9]{4}?-.*:[0-9]{2}?).*/\1/') $n
done < /tmp/packages | sort
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.