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 initial
và installed
chỉ 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 custom
và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.
something
và khôngsomething-common
là tốt.