Làm thế nào để tìm các gói cài đặt thủ công?


48

Tôi đã cài đặt Ubuntu 10.10 đơn giản trên máy tính của mình và cài đặt một số phần mềm thông qua apt-get. Tuần trước tôi đã xoay sở để phá vỡ mọi thứ và chỉ bắt đầu lại từ đầu, và tôi cần cài đặt lại phần mềm của mình. Có cách nào để tạo danh sách với tất cả các gói mà tôi đã cài đặt thủ công không?

Vì vậy, nó sẽ cung cấp cho tôi một danh sách như thế nào texlive, ...và không texlive, texlive-dep1, textlive-dep2, ...và tất cả các gói tiêu chuẩn bị loại bỏ?

Nếu tôi có thể bằng cách nào đó tìm ra chương trình nào trong bản cài đặt thông thường mà tôi đã gỡ bỏ, điều đó cũng thật tuyệt vời!


Cập nhật 2015-05-23: Bây giờ tôi sử dụng Ansible làm quản lý cấu hình trên các hệ thống của mình. Ở đó tôi chỉ định các gói để cài đặt. Điều này phục vụ mục tiêu, cài đặt tất cả các chương trình trên một hệ thống mới, thậm chí tốt hơn. Vì vậy, câu hỏi này có thể là mục nhập vào một số quản lý cấu hình ánh sáng.

Câu trả lời:


24

Với đề xuất này, tôi cho rằng cài đặt cũ của bạn vẫn sẽ khởi động!

Để sao chép một bộ gói trên máy khác:

Trên hệ thống A, chạy:

dpkg --get-selections | grep -v deinstall > my-selections

Chuyển my-selectionstập tin sang Hệ thống B.

Trên hệ thống B, chạy:

dpkg --set-selections < my-selections

và sau đó:

sudo apt-get dselect-upgrade

Lưu ý quan trọng: nếu bạn đã cài đặt các gói từ kho và / hoặc PPA không chuẩn, bạn cũng sẽ muốn sao chép /etc/apt/sources.listvà nội dung của /etc/apt/sources.list.d/Hệ thống A sang Hệ thống B trước khi bạn chạy nâng cấp.

Bạn cũng có thể sử dụng dpkgđể xem những gì bạn đã xóa (NB: điều này cũng sẽ bao gồm các gói bạn đã cài đặt xóa thủ công ):

dpkg --get-selections | grep deinstall

Bạn có thể thấy kết quả của mình trong thiết bị đầu cuối, hoặc, tất nhiên, chuyển hướng đến một tệp.


9
Tôi muốn có một danh sách tất cả các gói, nhưng tôi chỉ muốn có tên của các gói mà tôi đã cài đặt rõ ràng. Vì vậy, chỉ somethingvà không something-commonlà tốt.
Martin Uting

6
Vâng, trong khi điều này là hữu ích, nó không làm những gì câu hỏi yêu cầu.
Timmmm

3
Nếu bạn làm điều này, thì các phụ thuộc được cài đặt tự động sẽ không bao giờ được làm sạch khi bạn gỡ bỏ chương trình. Tại sao mọi người lại bỏ phiếu trả lời một câu trả lời mà người hỏi nói cụ thể là anh ta không muốn?
jbo5112

20

Chủ đề này từ superuser.com cung cấp giải pháp này:

aptitude search '?installed ?not(?automatic)'

2
Điều này không làm việc cho tôi. Chỉ liệt kê tất cả mọi thứ được cài đặt, hoặc chắc chắn nhiều hơn tôi đã yêu cầu rõ ràng.
Timmmm

Nó liệt kê tất cả mọi thứ bạn đã cài đặt apt-get, cộng với sự phụ thuộc của chúng. Vì vậy, ví dụ, nếu bạn đã cài đặt aptitude, thì nó cũng sẽ liệt kêapt-xapian-index aptitude-common libboost-iostreams1.54.0 libclass-accessor-perl libcwidget3 libept1.4.12 libio-string-perl libparse-debianchangelog-perl libsigc++-2.0-0c2a libsub-name-perl libtimedate-perl libxapian22 python-chardet python-debian python-six python-xapian
Runemoro

10

Nếu nhật ký apt của bạn nằm trong / var / log / apt, một cái gì đó như thế này sẽ hoạt động:

gunzip -c /var/log/apt/history.log.*.gz | grep "apt-get install"

Hoặc nếu bạn muốn loại bỏ một số rác lặp đi lặp lại trong đầu ra:

gunzip -c /var/log/apt/history.log.*.gz | grep "apt-get install" \
  | cut -f4- -d" " | sort | uniq

6

Bạn có thể sử dụng apt-mark , nhưng tôi khuyên dùng debfoster :

sudo apt-get install debfoster
sudo debfoster

Điều này sẽ kiểm tra tất cả các gói đã cài đặt và tìm ra gói nào đang cài đặt các gói khác:

texlive-full is keeping the following 161 packages installed:
  cm-super cm-super-minimal context doc-base dvipng feynmf
  fonts-gfs-artemisia fonts-gfs-baskerville fonts-gfs-bodoni-classic
  ...
Keep texlive-full? [Ynpsiuqx?], [H]elp:

Khi bạn trả lời "y" cho mỗi câu hỏi (chỉ cần nhấn Enter để di chuyển nhanh), debfoster sẽ thu thập danh sách gói và viết từng dòng một vào một tệp. Theo mặc định, đây là lúc /var/lib/debfoster/keepers. Nó trông như thế này:

gnome-do
texlive-full
...

Tôi cấu hình debfoster thông qua /etc/debfoster.confđể đặt danh sách này /etc/debfoster-keepersvà theo dõi tệp với etckeeper để giữ lịch sử và sao lưu. Câu trả lời ở đây cho thấy cách cài đặt danh sách các gói từ tệp văn bản được phân tách bằng dòng mới:

sudo apt-mark manual $(cat debfoster-keepers)

Lưu ý một giới hạn ở đây, các gói bạn đã thanh trừng có dấu '-' trước chúng. Vì vậy, bạn muốn loại bỏ những dòng đó trước khi gọi apt-mark.

Mặc dù trang web của trình gỡ lỗi nói rằng trình gỡ lỗi không được ủng hộ về năng khiếu, tôi thích cấu hình đơn giản và nhanh chóng của trình gỡ lỗi. Nó đặt bạn vào giữa cơ sở dữ liệu gói của bạn và cho phép bạn dọn dẹp mọi thứ, làm cho các gói tự độngthủ công trở nên rõ ràng hơn.

Nhập "h" tại dấu nhắc debfoster để giải thích các tùy chọn của bạn. Thể loại "?" để xem mô tả gói. Cách làm ở đây có thể hữu ích.


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

Cung cấp tất cả các gói được cài đặt thủ công (không phải gói hệ thống, không phụ thuộc). Ví dụ nó cho thấy build-essentialnhưng không gcc.


3

Đối với những người thích sử dụng các công cụ apt- *, có một tiện ích apt-mark cho phép cả truy vấn và sửa đổi trạng thái thủ công / tự động.

apt-mark showmanual

Bạn cũng có thể chỉ định mẫu cho các gói bạn quan tâm:

apt-mark showmanual qemu\*

Đây là vé.
John Von Neumann

2

Cuối cùng tôi đã nhận được nó ngay bây giờ:

outfile="$(mktemp)"
pattern='(\[INSTALLIEREN\]|\[INSTALL\])'

if [[ -f "/var/log/aptitude.1.gz" ]]
then
        gunzip -c /var/log/aptitude.*.gz | grep -E "$pattern" | awk '{ print $2; }' > "$outfile"
fi

if [[ -f "/var/log/aptitude" ]]
then
        grep -E "$pattern" "/var/log/aptitude" | awk '{ print $2; }' >> "$outfile"
fi

sort "$outfile"
rm "$outfile"

2
Tôi đoán điều này chỉ hoạt động nếu bạn chỉ cài đặt các gói bằng cách sử dụng aptitude. Có những tập tin tương tự trong /var/log/apt/history.log(.N.gz)mặc dù.
Timmmm

Bạn có thể sử dụng zgrepthay vì gunziphoặc zcatđường ống đến grep. Tôi tin rằng đó là một tập lệnh bao bọc với gzip tôi tin. Nó cũng chấp nhận các tệp không nén, vì vậy bạn có thể đơn giản hóa tập lệnh của mình thànhzgrep -E '(\[INSTALLIEREN\]|\[INSTALL\])' /var/log/aptitude* | awk '{ print $2 }'
Steve Buzonas

2

Tôi có thể lấy mọi thứ bằng cách mở tệp nhật ký trong / var / log / apt /

Sau đó tôi đi vào và tự lọc các gói cài đặt apt-get. Có thể có một cách để làm điều này theo chương trình nhưng tôi không biết về nó.


1
cd /var/log/apt
cat  history.log | grep Commandline

bằng cách này bạn sẽ thấy danh sách các lệnh được thực hiện trong quá khứ.

Xóa mã grep nếu bạn cần thêm thông tin:

less history.log

nếu nhật ký được nén (tức là kết thúc bằng gz)

gunzip <filename>

để nén lại khi hoàn thành, bạn có thể làm:

gzip <filename>

1
Thay vì giải nén và giải nén các tệp nhật ký, tại sao không sử dụng zcat? Nó là dễ dàng như việc zcat filename.gz. Người ta chỉ có thể sử dụng nó trên các tệp nén gzip thay cho cat. Cũng grepcó thể được thay thế bằng zgrep, ví dụ zgrep Commandline history.log.1.gz.
lgarzo

Dựa trên ý tưởng của bạn, tôi đã đưa ra một dòng lệnh : (grep "Commandline" history.log ; zgrep "Commandline" history.log.*.gz ) | grep " install " | grep -v -- "--yes" | sed -r "s/^.*install //". Nó có lỗi, bởi vì các gói bị loại bỏ cũng được liệt kê và nếu một gói được cài đặt nhiều lần, nó được liệt kê nhiều lần.
lgarzo

1

Tôi không thấy bất kỳ giải pháp nào ở đây làm việc cho tôi, tôi đã cài đặt khá nhiều gói gỡ lỗi với dpkg và một vài mục tôi đặc biệt đang tìm kiếm bị thiếu.

Một lớp lót khá dài, nhưng thuận tiện để sao chép và dán sẽ là:

export DPKG_INITIAL=$(mktemp) DPKG_INSTALLED=$(mktemp) DPKG_CUSTOM=$(mktemp) DPKG_DEPS=$(mktemp) zgrep -E '^Package' /var/log/installer/initial-status.gz | awk '{ print $2 }' > $DPKG_INITIAL ; awk '$3 !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", $3) ; gsub(/:.+/, "", $4) ; a[$4]=$3 } END { for (p in a) { if (a[p] == "install") { print p } } }' /var/log/dpkg.log | sort -u > $DPKG_INSTALLED ; comm -23 installed initial > $DPKG_CUSTOM ; function rdep() { apt-cache rdepends $1 | tail -n +3 | sed -e 's/^ //' -e '/^ /d' | cut -d':' -f1 | sort -u; } ; echo "$(for i in $(cat custom) ; do rdep $i ; done)" | sort -u > $DPKG_DEPS ; comm -23 custom deps > my-packages ; rm $DPKG_INITIAL $DPKG_INSTALLED $DPKG_CUSTOM $DPKG_DEPS

Lệnh trên lưu một danh sách các gói vào một tệp trong thư mục làm việc hiện tại của bạn có tên my-packages.

Giải trình

Trước tiên tôi xây dựng một danh sách các gói bao gồm đường cơ sở của các gói được chọn trong khi cài đặt.

zgrep -E '^Package' /var/log/installer/initial-status.gz | awk '{ print $2 }' > initial

Tiếp theo là một danh sách dài các mục được cài đặt nói chung.

awk '$3 !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", $3) ; gsub(/:.+/, "", $4) ; a[$4]=$3 } END { for (p in a) { if (a[p] == "install") { print p } } }' /var/log/dpkg.log | sort -u > installed

Sau đó tôi đã so sánh hai tệp initialinstalledchỉ liệt kê các mục duy nhất để cài đặt.

comm -23 installed initial > custom

Từ đó tôi muốn lọc ra các phụ thuộc, đây là nơi phương thức này có thể bỏ lỡ một số gói mong muốn, nó không biết về các phụ thuộc cũng được cài đặt rõ ràng.

Tôi đã viết một hàm bash nhanh để rút ngắn các bước này trong việc xử lý các mục này.

function rdep() { apt-cache rdepends $1 | tail -n +3 | sed -e 's/^ //' -e '/^ /d' | cut -d':' -f1 | sort -u; }

Sau đó tôi chuyển từng dòng từ tệp của tôi customvào hàm này với xargs.

echo "$(for i in $(cat custom) ; do rdep $i ; done)" | sort -u > deps

Khi tôi đã có một danh sách dài về mọi phụ thuộc có thể, (không chắc chắn về mọi tuyên bố có thể), một lần nữa tôi lại nhận được các dòng duy nhất cho một tệp.

comm -23 custom deps > manual

Và danh sách các gói đã hoàn thành của tôi hiện nằm trong một tệp có tên manualđể tôi xem xét.


0

Ai đó đã liên kết với https://unix.stackexchange.com/questions/3595/ubfox-list-explicitly-installed-packages/3624#3624 có giải pháp tốt, nhưng, nó không hoạt động chính xác như đầu ra từ năng khiếu đã thay đổi. Đây là phiên bản cập nhật, dựa trên các gói được cài đặt so với 12.04 LTS. Bạn sẽ cần aptitudecài đặt, đó là yêu cầu duy nhất.

aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' > currentlyinstalled && wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest | cut -f 1 | sort -u > defaultinstalled && comm -23 currentlyinstalled defaultinstalled

Để chia lệnh trên thành các phần, bit này xuất ra một gói cho mỗi dòng của mọi thứ được cài đặt trên hệ thống

aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' > currentlyinstalled

Và điều này tải xuống danh sách gói mặc định và cắt thông tin dư thừa.

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

commso sánh hai tệp và xuất ra các gói không có trong danh sách mặc định.

comm -23 currentlyinstalled defaultinstalled

Bạn cũng có thể vào trang web khác và cập nhật câu trả lời ở đó.
Martin Uting

0

Sử dụng tệp kê khai phân phối làm bộ gói cơ sở. Sắp xếp các kết quả được cài đặt thủ công vào các nhóm gói theo kiến ​​trúc và phần, do đó việc tập trung vào các nhóm gói dễ dàng hơn (có thể bạn không quan tâm đến một số phần).

https://gist.github.com/darrenleeweber/8cc570ff402f19af7fa4

#!/bin/bash

manifest_url='http://releases.ubuntu.com/releases/trusty/ubuntu-14.04.3-desktop-amd64.manifest'
manifest_file=$(echo $manifest_url | sed -e 's#.*/##g')
if [ ! -e $manifest_file ]; then
    wget -q $manifest_url
fi
cat $manifest_file | cut -f1 | sort -u > default_installed.txt

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

comm -23 currently_installed.txt default_installed.txt > manually_installed.txt

# sort the 'mannually_installed.txt' packages by architecture and section
mkdir -p package_files
while read p; do
    apt-cache show $p > info.txt
    arch=$(grep -m1 'Architecture: ' info.txt | sed -e 's/Architecture: //')
    section=$(grep -m1 'Section: ' info.txt | sed -e 's/Section: //' -e 's/\//_/g')
    file="${arch}_${section}_packages.txt"
    echo $p >> "package_files/$file"
done <manually_installed.txt

rm info.txt

Sẽ dễ dàng sửa đổi các tệp gói để mỗi dòng có tiền tố apt-get install -y và tệp là một tập lệnh bash. Sau đó, tất cả các tệp gói có thể được bao gồm trong một vòng cung cấp mơ hồ.
Darren Weber

0
#! /bin/sh
DEFAULT=`tempfile`
CURRENT=`tempfile`
cat /var/log/installer/initial-status.gz | gzip -d | grep '^Package:' | awk '{ print $2}' | sort -u > $DEFAULT
aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' | awk '{ print $1}' > $CURRENT
comm -23 $CURRENT $DEFAULT
rm $DEFAULT
rm $CURRENT

0

Tôi đã không tìm thấy một cái phù hợp với mình, vì vậy tôi đã viết một kịch bản. Bằng cách phân tích nội dung của /var/log/apt/history.log* và / var / log / aptitude, sau đó sắp xếp theo datetime, dẫn đến hai danh sách, một danh sách được cài đặt thủ công pkgs, một danh sách khác được cài đặt nhưng loại bỏ pkgs. Tập lệnh với xác minh 'danh sách apt'. một chút sai lệch, bởi vì việc sử dụng dpkg được cài đặt và sửa đổi nguồn PPA.

Tôi đặt ở đây, https://github.com/ee े / exp-bin / blob / master / elf-install-pkg.pl .

nếu bất cứ ai cần kiểm tra nó, có thể cần sửa đổi một số mã, vì các tệp nhật ký của tôi được trộn lẫn bằng tiếng Trung và tiếng Anh (đặc biệt là định dạng datetime RFC2822), tôi cần xử lý nó. nhập mô tả hình ảnh ở đây


Ảnh chụp màn hình văn bản không thể đọc được đó là gì?
muru

Đó là đầu ra kịch bản của tôi. Nhưng hôm nay tôi thấy dnf từ Fedora hiệu quả hơn. "Lịch sử dnf" hiển thị một lịch sử thuần túy của hoạt động gói.
eexpress không tưởng

0

Tôi nghĩ rằng bạn muốn sử dụng /var/log/apt/history.logvà bạn bè của mình để đưa ra những thay đổi đã được thực hiện:

zcat /var/log/apt/history.log.*.gz | cat - /var/log/apt/history.log | grep -Po '^Commandline: apt(?:-get)? install (?!.*--reinstall)\K.*'

(Được sửa đổi từ nguồn )

Sẽ cung cấp cho bạn tất cả các gói đã được cài đặt tại dòng lệnh bằng cách sử dụng một biến thể của apt-get install.

Nó nhận được các tệp được nén trong các tệp cũ history.logthêm chúng với dòng điện history.logvà chuyển qua grep, trích xuất các dòng bằng apt [-get] install [và / hoặc cài đặt lại] và hiển thị phần còn lại của dòng (cờ -o) tương đương với tên gói.

Điều này sẽ cần một chút mod (ví dụ với sed) nếu bạn chỉ muốn các tên gói trên các dòng riêng biệt; một bài tập cho người đọc!

Điều đáng chú ý là trình quản lý gói synap ( gksu synaptichoặc kdesudo synaptic) trong phần "trạng thái" có danh sách "được cài đặt (thủ công)". Nếu bạn đánh dấu toàn bộ danh sách để xóa [không áp dụng !!] bạn sẽ có thể lưu các thay đổi được đánh dấu và nhận danh sách các gói theo cách đó. Thận trọng: điều này bị khóa synapticđối với tôi (tính toán loại bỏ phụ thuộc có lẽ).


Sao chép từ câu trả lời của tôi ở nơi khác.
pbhj
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.