當前位置: 首頁>>技術教程>>正文


生成手動安裝的軟件包列表和查詢單個軟件包

, , ,

問題描述

我想獲得由aptaptitude手動安裝的軟件包列表,並能夠找出foobar軟件包是手動安裝還是自動安裝。有沒有從命令行做到這一點的幹淨方式?

最佳解決方案

您可以使用這兩個one-liners中的任何一個。兩者在我的機器上產出完全相同的輸出,並且比迄今為止(2014年7月6日)提出的所有解決方案都更精確。

使用apt-mark

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

使用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)

盡管我懷疑這些包實際上是由用戶安裝的,或者在安裝之後通過語言本地化設置或者例如通過圖騰編解碼器安裝程序。此外,linux-header版本也似乎積累,即使我隻安裝了非version-specific元組件。例子:

libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29    

它是如何工作的:

  1. 獲取手動安裝的軟件包列表。為了適應能力,額外的sed去除行尾的剩餘空白。

  2. 獲取全新安裝後安裝的軟件包列表。

  3. 比較文件,隻輸出文件1中不存在於文件2中的行。

其他可能性也不適用:

  • 使用ubuntu-14.04-desktop-amd64.manifest文件(用於Ubuntu 14.04的here)而不是/var/log/installer/initial-status.gz。盡管沒有,更多的軟件包顯示為手動安裝。

  • 使用apt-mark showauto而不是/var/log/installer/initial-status.gzapt-mark例如不包含xserver-xorg包,而另一個文件包含。

我使用各種其他StackExchange職位作為參考,但沒有工作以及上述解決方案:

都列出比上述解決方案更多的軟件包。

編輯:如果您從以前的版本升級,該怎麽做:

如果您已將Ubuntu從一個版本升級到下一版本,則可能需要調整此過程。在這種情況下,除了當前版本的initial-status.gz文件外,我還要檢查新版本的清單文件(參見上文)。隻需添加另一個比較即可輕鬆完成此操作。隻使用清單文件將不起作用,因為清單文件不幸並不包含initial_status.gz文件(我選中)所做的所有內容。

次佳解決方案

在apt的新版本中,還有apt-mark命令

apt-mark showmanual

第三種解決方案

如果包自動安裝,apt-mark showauto | grep -iE '^foobar$'將輸出”foobar”,否則不會。

aptitude search '!~M ~i'將列出未自動安裝的軟件包。可惜aptitude從10.10開始不會成為Ubuntu桌麵上默認安裝的一部分。

第四種方案

以下腳本將打印出所有未設置為自動安裝的軟件包,因此已手動安裝:

#!/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))

它基於apt-mark如何打印自動安裝的軟件包。

第五種方案

對於Ubuntu 16.04,請查看日誌文件/var/log/apt/history.log

例如:

zgrep 'Commandline: apt' /var/log/apt/history.log /var/log/apt/history.log.*.gz

這並不完美,但它很好地清楚了我手工安裝的內容。將一個-B 1放在grep上以查看它的安裝時間。

示例輸出

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

不知道這是否挑選aptitude或不。它似乎沒有從Ubuntu軟件桌麵應用程序中選擇安裝。

第六種方案

正如幾位人士所評論的,apt-mark showmanual似乎有點錯誤(我把它報告為bug 727799)。當我使用它時,它實際上報告了很多甚至沒有記錄在/var /lib /apt /extended_states(其中應該存儲的地方)的內容,而apt-get沒有記錄安裝在/var中的東西/lib /apt /extended_states(隻在/var /lib /dpkg /status中)。上麵的txwikinger的python腳本直接從/var /lib /apt /extended_states中繪製,但如果今天使用它,語法可能不起作用(我的Kubuntu 13.10開始產生錯誤)。更新的語法是:

#!/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))

對我來說,這是一個非常短的5個項目,看起來並不準確。

第七種方案

要獲取所有軟件包的列表(未安裝,由用戶安裝或默認安裝,跨所有PPA),apt采用以下方法:

apt list [option]

對此有用的可能選項是:

--installed僅顯示係統上安裝的軟件包(大約50,000以上)

--manual-installed可以列出由命令顯式安裝的包,可以是直接包含的,也可以是依賴包。

或者,你可以這樣做:

apt list --manual-installed | grep -F \[installed\]以獲取僅由用戶命令及其依賴關係產生的軟件包列表,並獲取有關它們的其他信息,例如支持的版本和體係結構(x86,x86_64,amd64,all等)

參考資料

本文由Ubuntu問答整理, 博文地址: https://ubuntuqa.com/zh-tw/article/396.html,未經允許,請勿轉載。