Tìm tất cả các gói do người dùng cài đặt


38

Có cách nào để có được danh sách tất cả các gói do người dùng cài đặt trên hệ thống Ubuntu, tức là các gói được cài đặt trên đầu các gói được cài đặt mặc định không?

(Ý tưởng là để có được một danh sách toàn diện có thể được sử dụng để cài đặt các gói tương tự trên bản cài đặt Ubuntu sạch)

Câu trả lời:


15

Nhìn vào những tập tin này,

  1. ' /var/log/installer/initial-status.gz' - cài đặt chính của bạn
    • ngày tập tin này sẽ là ngày cài đặt của bạn (tôi nghĩ)
    • ' /var/log/dpkg.log' Cập nhật dòng thời gian (đây là những gì bạn muốn)
    • ' /var/log/apt/term.log' - những thứ aptđược cập nhật trên hệ thống của bạn
    • ' /var/cache/apt/archives/'sẽ chứa các debgói được tải xuống để cài đặt

Cập nhật: sử dụng hai bước sau đây để biết danh sách chính xác các bản cài đặt mới:

  1. thi hành: grep -w install /var/log/dpkg.log > full-list.log
  2. Nhìn vào các dòng vượt quá /var/log/installer/initial-status.gzdấu thời gian

Vì bạn muốn cài đặt sạch trên một hệ thống khác với các gói này, bạn thậm chí có thể sao chép các tệp 'deb' từ đường dẫn 'cache / apt / archives' sang cài đặt mới và cài đặt chúng trong một lần chụp (không cần tải xuống họ một lần nữa).


Cảm ơn vì tiền hỗ trợ. Nó rất hữu ích, mặc dù tôi đã tìm kiếm thêm một lệnh để có được danh sách này. mèo /var/log/dpkg.log | grep 'install' dường như đến gần nếu tôi bỏ qua các mục được cài đặt cho đến ngày / giờ cài đặt
Rabarberski

Thêm một lý do cho việc bỏ phiếu sẽ giúp hiểu một vấn đề trong câu trả lời, nếu có. Cũng sẽ dẫn đến câu trả lời tốt hơn trong tương lai.
nik

Oeps, downvote đã vô tình là của tôi. Tôi đã nâng cao câu trả lời của bạn. Khi tôi cố gắng đánh dấu câu trả lời của bạn là 'trận chung kết', tôi đã bỏ lỡ và nhấn mũi tên bỏ phiếu. Cố gắng hoàn tác nó hiển thị thông báo: "Bình chọn quá cũ để được thay đổi, trừ khi câu trả lời này được chỉnh sửa." Xin lỗi nik, cả cho downvote và sự nhầm lẫn. :-(
Rabarberski

@Rabarberski, điều đó xảy ra ... không có hại gì.
nik

không hoạt động nếu / var / log / trình cài đặt không tồn tại, như trên cài đặt máy chủ. Ngoài ra, sẽ rất hợp lý khi thêm SỐ PHIÊN BẢN nếu bạn đang nói về "Ubuntu" - Ubuntu nào?

8

Chỉ để cười, tôi kết hợp một lớp lót (ở đây phân chia rõ ràng) để tìm ra các gói được cài đặt thủ công , ngoại trừ các gói được cài đặt ban đầu và bất kỳ gói nào được cài đặt tự động:

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) \
  )

Điều này hoạt động cả trong bashvà trong zsh.


Điều này hoạt động gần như hoàn hảo, ngoại trừ nó dường như in ra một loạt các thư viện được cài đặt trong quá trình cài đặt ban đầu. Có một loạt các libtiff, libxcb, vv mà tôi không cài đặt bản thân mình. Câu trả lời này: superuser.com/a/105000/24349 đảm nhận việc đó bằng cách sắp xếp theo thời gian cài đặt và xóa mọi thứ trước thời gian cài đặt hệ thống. Tuyệt vời (ab) sử dụng vỏ!
haxney

3

Dựa trên thông tin trên, tôi đã viết một đoạn mã Python ngắn để liệt kê các gói được cài đặt thủ công. Xem liên kết này .

Hãy sử dụng nó mặc dù tôi không chịu trách nhiệm về nó. Tuy nhiên, phản hồi và đề xuất luôn được chào đón.


Rực rỡ! Phải mất một lúc để chạy, nhưng đó là giải pháp duy nhất tôi tìm thấy, chính xác là thứ tôi cần!
haxney

2
Thật không may, liên kết hiện đã bị hỏng (hiển thị dấu vết trăn) thể hiện giá trị của việc đặt câu trả lời ở đây (đặc biệt đối với "kịch bản trăn ngắn"
David Ljung Madison Stellar

Đã tìm thấy một repo github với tập lệnh: github.com/gerjantd/bin/blob/master/iêu Nhấp vào 'raw' để tải xuống và chạy với 'python list_maningly_installed_packages.py'
David Ljung Madison Stellar

2
Liên kết github hiện cũng bị hỏng ...
Suzana

2

Kiểm tra câu trả lời của tôi ở đây cho một câu hỏi liên quan: Làm cách nào tôi có thể hiển thị danh sách tất cả các gói được cài đặt trên hệ thống Debian của tôi? . Một số câu trả lời khác cho câu hỏi cũng chứa những gợi ý hay về việc nhận danh sách như vậy.

Câu hỏi này nên được đánh dấu trùng lặp vì câu hỏi trước đó cũng bao gồm câu hỏi này, nhưng có thể hữu ích khi đặt câu hỏi này để tự tìm kiếm dễ dàng hơn.


1

giả sử bạn có một lịch sử nhất quán và sử dụng năng khiếu:

history | grep -e "^..... aptitude install"

sẽ chỉ liệt kê các gói mà bạn đã cài đặt với cài đặt aptitude ... duh


1

Đây là một công việc hack, nhưng nó hoàn toàn hoạt động.

Trước tiên, hãy truy cập http://release.ubfox.com/maverick/ (hoặc bất kỳ phiên bản Ubuntu nào bạn đang sử dụng) và lấy *.manifest filephiên bản được liên kết với phiên bản Ubuntu bạn đang sử dụng.

Sau đó, chạy tập lệnh sau (thay thế <manifest file>, dấu ngoặc nhọn và tất cả, với đường dẫn đến tệp bạn đã tải xuống. Bạn luôn có thể nối > outputvào cuối để tạo kết xuất tệp.

diff --suppress-common-lines <(sed 's/ .*//' <manifest file>) <(dpkg --get-selections | sed 's/[ \t].*//') | grep '>' | sed 's/[>] //'

1

Cảm ơn geekizard, mã tốt đẹp. Tôi đã sử dụng nó nhưng phải mất một thời gian để tìm ra cách để nó hoạt động. Đây là cách tôi đã làm trong Ubuntu 11.10. Nó hoạt động trong thiết bị đầu cuối bash:

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) \
  ) > user-installed-packages

Sau đó, để thêm một Tab- \t-Và installtrên mỗi dòng:

sed 's/$/\tinstall/' user-installed-packages >uip

Sau đó trên máy mới:

sudo dpkg --set-selections < uip

Và để cài đặt các gói:

sudo apt-get dselect-upgrade

0

Một cách khác để làm điều này là bằng cách xác định những gì đã được cài đặt dựa trên "tác vụ" của bạn để xác định các gói cơ sở để cài đặt theo nhu cầu ban đầu của bạn.

tasksel --list-tasks

Ít nhất bạn sẽ có server. Tuy nhiên, bạn có thể chọn để có nhiều hơn. Đối với mỗi tác vụ bạn đã cài đặt, bạn có thể nhận danh sách các gói được cài đặt lệnh sau thực hiện tất cả trong một dòng (chia nhỏ cho rõ ràng) cho các gói tôi đã chọn trong cài đặt của mình:

(tasksel --task-packages server ; \
 tasksel --task-packages openssh-server ; \
 tasksel --task-packages lamp-server) | sort | uniq

Một cách tiếp cận chung cho những điều trên sẽ là:

(for a in $( tasksel --list-tasks | grep "^i" | awk '{ print $2 }' ) ; \
 do tasksel --task-packages $a; done) | sort | uniq

Bây giờ sử dụng apt-cache depends --installed -i --recurse <packagename> | grep -v "^ "để có được một danh sách các phụ thuộc được sử dụng bởi tất cả các gói được xác định trong tác vụ. Điều này có thể được thực hiện trong một dòng như sau

apt-cache depends --installed -i --recurse \
     $(for a in $( tasksel --list-tasks | \
                   grep "^i" | \
                   awk '{ print $2 }' ) ; \
       do tasksel --task-packages $a; done) | grep -v "^ " | sort | uniq

Sau đây liệt kê tất cả các gói được cài đặt trong hệ thống của bạn (không bao gồm các phụ thuộc).

dpkg --get-selections | grep "[[:space:]]install" | awk '{print $1}'

Bây giờ sử dụng commlệnh để tìm những cái chỉ có trong danh sách thứ hai (tức là bỏ qua những cái có trong cả hai tệp và chỉ tệp đầu tiên)

comm -13 <(apt-cache depends --installed -i --recurse \
              $(for a in $( tasksel --list-tasks | \
                            grep "^i" | \
                            awk '{ print $2 }' ) ; \
                do tasksel --task-packages $a; done) | grep -v "^ " | sort ) \
         <( dpkg --get-selections | grep "[[:space:]]install" | \
            awk '{print $1}' | 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.