web-dev-qa-db-ja.com

手動でインストールされたパッケージのリストを生成し、個々のパッケージを照会する

aptまたはaptitudeによって手動でインストールされたパッケージのリストを取得し、foobarパッケージが手動または自動でインストールされたかどうかを確認したいと思います。コマンドラインからそれを行う素敵な方法はありますか?

182
Umang

これら2つのワンライナーのいずれかを使用できます。どちらも私のマシンでまったく同じ出力を生成し、この質問でこれまでに提案されたすべてのソリューション(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)

非常に少数のパッケージがまだクラックを通過しますが、これらはareであると思われますが、言語ローカリゼーションセットアップによるインストール直後、またはTotemコーデックインストーラーを使用します。また、バージョン固有ではないメタパッケージのみをインストールしたにもかかわらず、linux-headerバージョンも蓄積されているようです。例:

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

仕組み:

  1. 手動でインストールされたパッケージのリストを取得します。 aptitudeの場合、追加のsedは行の終わりに残っている空白を取り除きます。
  2. 新規インストール直後にインストールされたパッケージのリストを取得します。
  3. ファイルを比較し、ファイル2には存在しないファイル1の行のみを出力します。

他の可能性も同様に機能しません:

  • ubuntu-14.04-desktop-AMD64.manifestの代わりに/var/log/installer/initial-status.gzファイル( here Ubuntu 14.04の場合)を使用します。より多くのパッケージは、手動ではインストールされていないと表示されます。
  • apt-mark showautoの代わりに/var/log/installer/initial-status.gzを使用します。たとえば、apt-markにはxserver-xorgパッケージが含まれませんが、他のファイルには含まれます。

さまざまな他のStackExchange投稿を参照として使用しましたが、上記のソリューションほどうまく機能しません。

両方とも、上記のソリューションよりも多くのパッケージをリストします。

編集:以前のリリースからアップグレードした場合の対処:

Ubuntuをあるリリースから次のリリースにアップグレードした場合、おそらくこのプロセスを調整する必要があります。その場合、現在のリリースのinitial-status.gzファイルに加えて、新しいリリースのマニフェストファイル(上記を参照)を確認します。別の比較を追加するだけで簡単にできます。マニフェストファイルにはinitial_status.gzファイルに含まれるすべての内容が含まれていないため(残念ながら).

205
jmiserez

パッケージaptの新しいバージョンには、apt-markコマンドもあります

apt-mark showmanual
64
Daniel Alder

Ubuntu 16.04の場合、ログファイル/var/log/apt/history.logを確認してください。

例えば:

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

完璧ではありませんが、手作業でインストールしたものを正確に明確にするのにはかなり優れています。 grepに-B 1を追加して、インストールされた日時を確認します。

出力例

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 Softwareのデスクトップアプリからインストールをピックアップしないようです。

21
s1037989

apt-mark showauto | grep -iE '^foobar$'は、パッケージが自動的にインストールされた場合は「foobar」を出力し、それ以外の場合は何も出力しません。

aptitude search '!~M ~i'は、自動的にインストールされなかったパッケージをリストします。残念なことに、10.10以降、Ubuntuデスクトップのデフォルトのインストールには含まれません。

20
Li Lo

次のスクリプトは、自動インストールに設定されていないため手動でインストールされたすべてのパッケージを印刷します。

#!/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が自動的にインストールされたパッケージをどのように印刷するかに基づいています。

8
txwikinger

すべてのパッケージ(インストールされていない、ユーザーによってインストールされている、またはデフォルトでインストールされている、すべてのPPAを除く)のリストを取得するには、aptは次のメソッドを使用します。

apt list [option]

これに役立つ可能なオプションは次のとおりです。

--installedは、システムにインストールされているパッケージのみを表示します(約50,000以上)

--manual-installedは、コマンドによって直接または依存関係として明示的にインストールされたパッケージを一覧表示します。

または、次のこともできます。

apt list --manual-installed | grep -F \[installed\]は、ユーザーコマンドとその依存関係のみに起因するパッケージのリストを取得し、サポートされているバージョンやアーキテクチャ(x86、x86_64、AMD64、すべてなど)などの追加情報を取得します。

6
Aalok

数人がコメントしているように、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つのアイテムの非常に短いリストでしたが、どちらも正確ではないようです。

5
cluelesscoder

GUIソリューションを提供したいと思います。

enter image description here

  1. Synaptic Package Managerを開きます

  2. Statusに移動します

  3. Installed (manual)をクリックします

Aptまたはaptitudeによって手動でインストールされたパッケージのリストが表示されます。

残念ながら、foobarパッケージが手動でインストールされたか自動でインストールされたかを確認するオプションをCustom Filtersで見つけることができませんでした。

パッケージがInstalledの下にあり、Installed (manual)の下にない場合、パッケージは自動的にインストールされました。パッケージがInstalled (manual)の下にある場合、手動でインストールされました。

4
blueray

Apr-somethingコマンドを使用して誰もあなたに素敵な答えを与えない場合、hard wayでそれを行うことができます。 Apt-getはその情報を/ var/lib/apt/extended_statesに保存します。自動的にインストールされるファイルは、このファイルに追加されます。このファイルに既に手動でパッケージをインストールする場合、パッケージはこのファイルに残りますが、2行目に0が自動インストールされます。削除されません。

注:予想どおり、ファイル配置の変更が現れた場合に機能する可能性が高い、より良い回答。ファイルの場所に関する情報が役に立つ場合に備えて、私は私のものを保管しています。

2
Javier Rivera

たくさんググリングした後、私はこのスクリプトを組み立てることができました。それは私にとってはうまくいきます:

# 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
2
dufferZafar

Li Loが言ったように、apt-mark showautoは自動的にインストールされるものの詳細なリストを取得するはずです。

手動でインストールされたものを表示するために、aptitudeに素敵なシンプルな検索修飾子があることがわかりました。しかし、あなたはそれをしたくありません。ロケット科学を行う巨大なbashコマンドを書きたいと思います。

注:これは、大規模なbashコマンドをすべての友達に破壊することのクールさを示しています。

comm -3  <(dpkg-query --show -f '${Package} ${Status}\n' | \n
grep "install ok installed" | cut --delimiter=' ' -f 1) <(apt-mark showauto)

読みやすくするために、2行に分割しました。これは何をしますか?

  • まず、インストールされているパッケージのリストについてdpkgを照会します。
  • 実際にインストールされているもの(残りの設定だけでなく)をフィルタリングします
  • ステータスを切り落とします
  • そのリストをapt-markの自動化されたリストと比較します
  • できるからロックアウトします。
1
Oli