Tạo danh sách các gói được cài đặt thủ công và truy vấn các gói riêng lẻ


183

Tôi muốn có một danh sách các gói được cài đặt thủ công bởi apthoặc aptitudecó thể tìm hiểu xem một foobargó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?


Xem câu trả lời này trên unix.stackexchange.com để biết giải pháp lọc các gói chứng khoán.
Dirk Bergstrom

Có thể trùng lặp? - askubuntu.com/questions/365
JRG


Giải pháp thực sự tốt loại trừ các gói được cài đặt theo mặc định: Ubuntu liệt kê các gói được cài đặt rõ ràng
pcworld 30/11/13

Cẩn thận với ý kiến ​​của câu trả lời ở đây. Mọi người không nói cách xuất hiện nhiều gói hơn, nhưng họ quên rằng có những gói phụ thuộc được cài đặt từ một hướng dẫn được cài đặt.
Andre Figueiredo

Câu trả lời:


206

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:

  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ó.

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


7
Điều này đã không làm việc cho tôi vì /var/log/installer/initial-status.gzmấ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 manualhay không?
Anwar

1
Than ôi không có bảng kê khai cho các phiên bản máy chủ.
Antti Haapala

Tôi chạy showmanuallệnh (bên dưới). Và sử dụng commđể so sánh hai danh sách (sắp xếp). Các showmanualkết quả đã cho tôi 1.840 hơn gói độc đáo từ apt-mark showmanualkhô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.
sẽ

Tôi chỉ so sánh các giải pháp của bạn với 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;)]
Daniel Alder

64

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

35
Điều này cho thấy cách nhiều gói hơn tôi đã cài đặt bằng tay.
Umang

1
@Umang Bạn nói đúng. Tôi sẽ nói điều này không giống như thế này khi tôi viết câu trả lời này. Không có lý do gì để hệ thống của tôi coi linux-image-3.11.0-*-genericvv là thủ công
Daniel Alder

1
@Umang có thể điều này sẽ giúp bạn hỏiubub.com/questions/432743/ , nhưng câu trả lời không được chấp nhận. Thực tế là, nhiều gói cài đặt mới đã được đánh dấu là thủ công. Nhưng vẫn còn một số điều kỳ lạ. Để ở lại với ví dụ của tôi: linux-image-3.13.0-24-genericlà thủ công nhưng hiện tại linux-image-3.13.0-27-genericlà 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-genericnày đã thay đổi các phụ thuộc), nhãn thủ công sẽ tự động được đặt
Daniel Alder

5
@DanielAlder một số gói cài đặt mới phải được đánh dấu là thủ công. Nếu không có gói nào được đánh dấu là thủ công, toàn bộ hệ thống có thể bị xóa apt-get autoremove. Đây chắc chắn không phải là những gì bạn muốn.
Anton K

2
Nếu "cài đặt thủ công" có nghĩa là "được người dùng cài đặt sau khi cài đặt hệ điều hành ban đầu", đây không phải là một câu trả lời đúng.
Seamus

21

Đố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 1grep để 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 aptitudehay không. Nó dường như không nhận cài đặt từ ứng dụng máy tính để bàn Ubuntu.


1
Trong tất cả các câu trả lời trong nhiều năm qua, đây là câu trả lời duy nhất thậm chí đến gần trong máy chủ 18.04.
Quentin Skousen

20

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 searchhiể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)
Oli

1
@Oli: nhìn vào các mẫu tìm kiếm năng khiếu; mẫu tôi đang sử dụng nên thực hiện chính xác những gì OP muốn.
Li Lo

Tôi đã chạy nó. Nó cho thấy toàn bộ tải các gói không được cài đặt.
Oli

7
Một cái gì đó không đúng với điều này, tôi đang sử dụng 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.
ThatGraemeGuy

Điều này chắc chắn không hoạt động như yêu cầu, cũng in các gói được cài đặt sẵn.
Irfy

9

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.


Kudos cho bạn tốt thưa ông. Điều này thực sự hoạt động, trái ngược với câu trả lời được chấp nhận.
Irfy

chỉ hiển thị một vài gói cho tôi --- chắc chắn thiếu rất nhiều trong số họ.
Rmano

Tương tự ở đây, chắc chắn thiếu các gói được cài đặt thủ công, ngay sau khi tôi cài đặt chúng.
David Ljung Madison

Sử dụng sys.exit(1)mà không import syscó 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 syssử dụng exit(1).
Videonauth

7

Để 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), aptsử 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.)


5

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.


1
Sử dụng sys.exit(1)mà không import syscó 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 syssử dụng exit(1).
Videonauth

4

Tôi muốn đưa ra một giải pháp GUI.

nhập mô tả hình ảnh ở đây

  1. Mở Synaptic Package Manager

  2. Đi đến Status

  3. 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 foobargói được cài đặt thủ công hay tự động.

Nếu gói dưới Installednhư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.


2

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.


1
Không. Tôi đã xem nhanh tập tin đó để thấy rằng liferea được đánh dấu là tự động cài đặt. Tôi đã làm một apt-get install lifereavà 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ó 0thay 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.
Umang

Đúng. Lỗi của tôi, trong hệ thống của tôi không có dòng nào bằng 0, nhưng nó sẽ hiếm khi xảy ra. Tôi cập nhật câu trả lời chỉ trong trường hợp.
Javier Rivera

2

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

Bạn có thể sử dụng sort -uthay vì sort | unique. Vì apt-markkhô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.
jarno

Ồ, apt-markcó 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.
jarno

apt-cache searchlà 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
quang học

1

Như Li Lo đã nói, apt-mark showautosẽ 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ì

  • Đầu tiên chúng tôi truy vấn dpkg cho danh sách các gói được cài đặt.
  • Chúng tôi lọc những cái cho những cái thực sự được cài đặt (không chỉ cấu hình dư)
  • Chúng tôi cắt bỏ tình trạng
  • Chúng tôi so sánh danh sách đó với danh sách tự động từ apt-mark
  • Chúng tôi đá vì chúng tôi có thể.

Tôi nghi ngờ điều này là chính xác, vì dpkg thường hiển thị các gói chưa được cài đặt
txwikinger

Tôi biết ý của bạn là gì nhưng bash-fu của tôi không đủ mạnh. Tôi biết bạn có thể hiển thị trạng thái từ truy vấn dpkg, grep đó xuống và sau đó cắt bỏ trạng thái. Tôi sẽ đi
Oli

comm -3 <(dpkg -l | grep '^ii' | cut -d \ -f 3|sort) <(apt-mark showauto|sort)đúng hơn là tốt hơn;)
LassePoulsen

-1

Đ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
}
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.