Tôi muốn có một danh sách các gói được cài đặt thủ công bởi apt
hoặc aptitude
có thể tìm hiểu xem một foobar
gói được cài đặt thủ công hay tự động. Có cách nào gọn gàng để làm điều đó từ dòng lệnh?
Tôi muốn có một danh sách các gói được cài đặt thủ công bởi apt
hoặc aptitude
có thể tìm hiểu xem một foobar
gói được cài đặt thủ công hay tự động. Có cách nào gọn gàng để làm điều đó từ dòng lệnh?
Câu trả lời:
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ờ (ngày 6 tháng 7 năm 2014) trong câu hỏi nà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:
sed
dải bổ sung ra khoảng trắng còn lại ở cuối dòng.Các khả năng khác cũng không hoạt động:
ubuntu-14.04-desktop-amd64.manifest
tệ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à.apt-mark showauto
thay vì /var/log/installer/initial-status.gz
. apt-mark
ví dụ không bao gồm gói xserver-xorg, trong khi tệp khác thì có.Tôi đã sử dụng nhiều bài đăng StackExchange khác làm tài liệu tham khảo, tuy nhiên không có bài viết nào cũng như giải pháp trên:
Cả hai liệt kê nhiều gói hơn giải pháp trên.
EDIT: Phải làm gì nếu bạn đã nâng cấp từ bản phát hành trước:
Nếu bạn đã nâng cấp Ubuntu từ bản phát hành này sang bản phát hành tiếp theo, có lẽ bạn sẽ cần điều chỉnh quy trình này. Trong trường hợp đó, tôi sẽ kiểm tra tệp kê khai của bản phát hành mới hơn (xem bên trên) ngoài tệp ban đầu-status.gz từ bản phát hành hiện tại. 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. Chỉ sử dụng tệp kê khai sẽ không hoạt động, vì tệp tệp kê khai không may không chứa mọi thứ mà tệp init_status.gz thực hiện (tôi đã kiểm tra).
/var/log/installer/initial-status.gz
mất tích. Ngoài ra tôi muốn biết điều này có phụ thuộc vào việc đánh dấu apts manual
hay không?
showmanual
lệnh (bên dưới). Và sử dụng comm
để so sánh hai danh sách (sắp xếp). Các showmanual
kết quả đã cho tôi 1.840 hơn gói độc đáo từ apt-mark showmanual
không được hiển thị bằng phương pháp này. KHÔNG có gói nào là duy nhất cho đầu ra của phần mềm này comm
. Tôi nghĩ sẽ thú vị hơn khi ghi lại rằng đối với PC của tôi, 894 gói được liệt kê trong cả hai kết quả. Không chắc chắn tại sao có sự khác biệt lớn như vậy. Một số gói (nhiều?) Dường như được phát hành cụ thể. Những thứ khác như các thành phần XOrg, GTK và lib*
những thứ có thể là các bản cập nhật. Dù sao câu trả lời này là một khởi đầu rất tốt.
apt-mark showmanual
. Thật thú vị khi có nhiều sự khác biệt có thể nhìn thấy. danh sách của bạn có 238 gói trong khi showmanual trả về 1717 gói. Trong số 2179 gói được cài đặt, chỉ có 223 trong cả hai danh sách, 15 chỉ trong gói của bạn (ví dụ: nodejs, lightdm) và 223 chỉ có trong showmanual (ví dụ: xserver-xorg, ub Ubuntu-desktop). Cảm giác như danh sách của bạn hữu ích hơn, nhưng không biết những khác biệt này đến từ đâu, không dễ để quyết định ... (nhưng tôi khá chắc chắn rằng tôi đã cài đặt nginx và lightdm một cách thủ công ...) [xin lỗi tôi sẽ viết giống nhau;)]
Trong các phiên bản mới hơn của gói apt, cũng có lệnh apt-mark
apt-mark showmanual
linux-image-3.11.0-*-generic
vv là thủ công
linux-image-3.13.0-24-generic
là thủ công nhưng hiện tại linux-image-3.13.0-27-generic
là tự động. Có vẻ như một bản nâng cấp của gói tham chiếu (trong trường hợp linux-image-generic
này đã thay đổi các phụ thuộc), nhãn thủ công sẽ tự động được đặt
apt-get autoremove
. Đây chắc chắn không phải là những gì bạn muốn.
Đối với Ubuntu 16.04, hãy kiểm tra tệp nhật ký /var/log/apt/history.log
.
Ví dụ:
zgrep 'Commandline: apt' /var/log/apt/history.log /var/log/apt/history.log.*.gz
Nó không hoàn hảo, nhưng nó khá tốt trong việc làm cho nó rõ ràng chính xác những gì tôi cài đặt bằng tay. Đặt một -B 1
grep để xem khi nó được cài đặt.
Ví dụ đầu ra
Commandline: apt install postgresql-9.5-plv8
Commandline: aptdaemon role='role-install-file' sender=':1.85'
Commandline: apt install task
Commandline: apt autoremove
Commandline: apt install atom
Commandline: apt upgrade
Commandline: apt-get install asciinema
Commandline: apt install iperf3
Commandline: apt upgrade
Commandline: apt-get install chromium-browser
Commandline: apt install joe cpanminus build-essential postgresql libdbd-pg-perl libcrypt-openssl-bignum-perl libcrypt-openssl-rsa-perl libio-socket-ssl-perl libnet-ssleay-perl libssl-dev
Commandline: aptdaemon role='role-commit-packages' sender=':1.2314'
Commandline: apt install git
Commandline: apt install sqlite
Commandline: apt install whois
Commandline: apt install libdbd-pg-perl
Commandline: apt install perl-doc
Commandline: apt upgrade
Không chắc chắn nếu điều này chọn lên aptitude
hay không. Nó dường như không nhận cài đặt từ ứng dụng máy tính để bàn Ubuntu.
apt-mark showauto | grep -iE '^foobar$'
sẽ xuất "foobar" nếu gói được cài đặt tự động, không có gì khác.
aptitude search '!~M ~i'
sẽ liệt kê các gói không được cài đặt tự động. Đây là một khả năng đáng tiếc sẽ không phải là một phần của cài đặt mặc định trên Ubuntu Desktop bắt đầu từ 10.10.
aptitude search
hiển thị TẤT CẢ các gói không chỉ các gói được cài đặt thủ công (tôi cho rằng đó là những gì OP muốn)
aptitude search '!~M ~i'
và nó liệt kê 1043 gói. Không có cách nào tôi cài đặt nhiều gói bằng tay.
Kịch bản sau đây sẽ in ra tất cả các gói không được đặt thành cài đặt tự động và do đó được cài đặt thủ công:
#!/usr/bin/python
try:
import apt_pkg
except ImportError:
print "Error importing apt_pkg, is python-apt installed?"
sys.exit(1)
apt_pkg.init()
STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states"
auto = set()
tagfile = apt_pkg.TagFile(open(STATE_FILE))
while tagfile.step():
pkgname = tagfile.section.get("Package")
autoInst = tagfile.section.get("Auto-Installed")
if not int(autoInst):
auto.add(pkgname)
print "\n".join(sorted(auto))
nó dựa trên cách apt-mark in ra các gói được cài đặt tự động.
sys.exit(1)
mà không import sys
có thể dẫn đến một lỗi trong các phiên bản mới hơn của python. Hoặc là import sys
sử dụng exit(1)
.
Để có danh sách tất cả các gói (không được cài đặt, cài đặt bởi người dùng hoặc được cài đặt theo mặc định, trên tất cả các PPA), apt
sử dụng phương pháp sau:
apt list [option]
Các tùy chọn có thể hữu ích cho việc này là:
--installed
để chỉ hiển thị các gói được cài đặt trên hệ thống (trong số hơn 50.000)
--manual-installed
để liệt kê các gói được cài đặt rõ ràng bằng lệnh, trực tiếp hoặc dưới dạng phụ thuộc.
Ngoài ra, bạn có thể làm:
apt list --manual-installed | grep -F \[installed\]
để có được danh sách các gói phát sinh từ các lệnh của người dùng và chỉ phụ thuộc của chúng và để có thêm thông tin về chúng như phiên bản và kiến trúc được hỗ trợ (x86, x86_64, amd64, tất cả, v.v.)
Như nhiều người đã nhận xét, chương trình apt-mark showmanual có vẻ hơi lỗi (và tôi đã báo cáo đó là lỗi 727799 ). Khi tôi đang sử dụng, nó thực sự báo cáo rất nhiều nội dung thậm chí không đăng nhập / var / lib / apt / Extended_states (nơi được cho là được lưu trữ) và apt-get không đăng nhập mọi thứ như được cài đặt trong / var / lib / apt / Extended_states (chỉ trong / var / lib / dpkg / status). Tập lệnh python của txwikinger ở trên rút ra trực tiếp từ / var / lib / apt / Extended_states nhưng nếu bạn đang sử dụng nó thì cú pháp có thể không hoạt động (tôi chỉ bắt đầu tạo lỗi với Kubfox 13.10). Cú pháp cập nhật là:
#!/usr/bin/python
import sys
try:
import apt_pkg
except ImportError:
print "Error importing apt_pkg, is python-apt installed?"
sys.exit(1)
apt_pkg.init()
STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states"
auto = set()
tagfile = apt_pkg.TagFile(open(STATE_FILE))
while tagfile.step():
pkgname = tagfile.section.get("Package")
autoInst = tagfile.section.get("Auto-Installed")
if not int(autoInst):
auto.add(pkgname)
print "\n".join(sorted(auto))
Đối với tôi đây là một danh sách rất ngắn gồm 5 mục dường như không chính xác.
sys.exit(1)
mà không import sys
có thể dẫn đến một lỗi trong các phiên bản mới hơn của python. Hoặc là import sys
sử dụng exit(1)
.
Tôi muốn đưa ra một giải pháp GUI.
Mở Synaptic Package Manager
Đi đến Status
Nhấp chuột Installed (manual)
Nó sẽ đưa ra danh sách các gói được cài đặt thủ công bởi apt hoặc aptitude.
Thật không may, tôi không thể tìm thấy bất kỳ tùy chọn nào Custom Filters
để tìm hiểu xem một foobar
gói được cài đặt thủ công hay tự động.
Nếu gói dưới Installed
nhưng không dưới Installed (manual)
thì nó được cài đặt tự động. Nếu gói dưới Installed (manual)
thì nó được cài đặt bằng tay.
Nếu không ai cho bạn một câu trả lời hay bằng cách sử dụng lệnh apr-Something, bạn có thể thực hiện nó một cách khó khăn . Apt-get lưu trữ thông tin của nó trong / var / lib / apt / Extended_states. Bất kỳ tệp nào được cài đặt tự động sẽ được thêm vào tệp này. Nếu bạn cài đặt một gói đã có trong tệp này theo cách thủ công, gói sẽ vẫn ở trong tệp này nhưng với Tự động cài đặt: 0 trong dòng thứ hai. Nó không bị xóa.
Lưu ý: Như dự kiến câu trả lời tốt hơn có khả năng hoạt động nếu thay đổi vị trí tệp đã xuất hiện. Tôi giữ của tôi chỉ trong trường hợp thông tin về vị trí tập tin là hữu ích.
apt-get install liferea
và nó không cài đặt nhưng tôi nhận được kết quả là một cái gì đó ảnh hưởng đến "được đánh dấu là cài đặt thủ công". Bây giờ liferea vẫn còn trong tệp, ngoại trừ dòng tiếp theo có 0
thay vì a 1
. Ngoài ra, bạn nên thay đổi mẫu regex của bạn thành " foobar$"
thay vì chỉ foobar
.
Sau khi googling rất nhiều, tôi đã quản lý để lắp ráp kịch bản này. Nó hoạt động ổn với tôi:
# List of all packages currently installed
current=$(dpkg -l | awk '{print $2}' | sort | uniq)
# List of all packages that were installed with the system
pre=$(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort | uniq)
# List of packages that don't depend on any other package
manual=$(apt-mark showmanual | sort | uniq)
# (Current - Pre) ∩ (Manual)
packages=$(comm -12 <(comm -23 <(echo "$current") <(echo "$pre")) <(echo "$manual") )
for pack in $packages; do
packname=$(echo $pack | cut -f 1 -d ":")
desc=$(apt-cache search "^$packname$" | sed -E 's/.* - (.*)/\1/')
date=$(date -r /var/lib/dpkg/info/$pack.list)
echo "# $desc"
echo "# $date"
echo "sudo apt-get install $pack"
echo -e ""
done
sort -u
thay vì sort | unique
. Vì apt-mark
không hiển thị kiến trúc, bạn nên loại bỏ nó khỏi đầu ra của dpkg trước khi cài đặt các thao tác (hoặc sử dụng dpkg-query -W -f='${Package}\n'
). Ngoài ra, dpkg có thể liệt kê một số gói hiện chưa được cài đặt. Đối với "desc", bạn có thể sử dụng `dpkg-query -W -f = '# $ {binary: Summary} \ n' $ pack, nhanh hơn.
apt-mark
có thể hiển thị kiến trúc cho một số gói, nhưng không phải cho nhiều như vậy dpkg -l
.
apt-cache search
là chậm Nhận danh sách các ngày đã cài đặt trước bằng cách sử dụng một cái gì đó như help.ubfox.com/community/ListInstalledPackagesByDate có thể hiệu quả hơn
Như Li Lo đã nói, apt-mark showauto
sẽ giúp bạn có một danh sách các thứ tự động được cài đặt.
Bây giờ để hiển thị những thứ được cài đặt thủ công, hóa ra có một công cụ sửa đổi tìm kiếm đơn giản đáng yêu cho năng khiếu. Nhưng bạn không muốn làm điều đó. Bạn muốn viết một lệnh bash khổng lồ làm một số khoa học tên lửa.
Lưu ý: Đây là một minh họa rõ hơn về việc bạn sẽ trông thật tuyệt vời khi thực hiện các lệnh bash lớn cho tất cả bạn bè của mình.
comm -3 <(dpkg-query --show -f '${Package} ${Status}\n' | \n
grep "install ok installed" | cut --delimiter=' ' -f 1) <(apt-mark showauto)
Tôi chia nó thành hai dòng để dễ đọc. Cái này làm gì
apt-mark
comm -3 <(dpkg -l | grep '^ii' | cut -d \ -f 3|sort) <(apt-mark showauto|sort)
đúng hơn là tốt hơn;)
Điều này sẽ liệt kê tất cả các gói được cài đặt thủ công mà không có: phụ thuộc, gói đã gỡ cài đặt, gói được cài đặt trong quá trình cài đặt hệ thống.
unopts() {
in=`cat`
echo "$in" | sed -r 's/ --[^ ]+//g;s/ -[^ ]+//g'
}
list() {
cat '/var/log/apt/history.log' |
grep --color=never -v '\-o APT::Status-Fd=4 \-o APT::Keep-Fds::=5 \-o APT::Keep-Fds::=6' |
egrep --color=never "Commandline: apt-get.* $1" |
sed -r "s/Commandline: apt-get//;s/ $1//" |
unopts |
tr ' ' '\n' |
sed '/^$/d'
}
hapt() {
tmp=`mktemp -d`
installed=$tmp/installed
deleted=$tmp/deleted
dpkg=$tmp/dpkg
list 'install' > $installed
list '(remove|purge|autoremove)' > $deleted
dpkg --get-selections |
grep -v 'deinstall' |
cut -f 1 > $dpkg
while read package
do
sed -i "0,/$package/{//d;}" $installed
done < $deleted
while read package
do
if [ -z "`grep --color=never "^$package$" $dpkg`" ]
then
sed -i "0,/$package/{//d;}" $installed
fi
done < $installed
cat $installed
rm -r $tmp
}