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


183

aptまたはによって手動でインストールされたパッケージのリストを取得しaptitudefoobarパッケージが手動または自動でインストールされたかどうかを確認できるようにします。コマンドラインからそれを行うきちんとした方法はありますか?


ストックパッケージを除外するソリューションについては、unix.stackexchange.comこの回答を参照してください。
ダークバーグストローム

重複する可能性がありますか?- askubuntu.com/questions/365
JRG


デフォルトでインストールされたパッケージを除外する本当に良いソリューション:Ubuntuリストに明示的にインストールされたパッケージ
pcworld

ここで回答のコメントに注意してください。人々は、より多くのパッケージが現れると言っているわけではありませんが、インストールされたマニュアルから依存パッケージがインストールされていることを忘れています。
アンドレフィ

回答:


206

これら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)

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

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

仕組み:

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

他の可能性もうまくいきません:

  • の代わりにubuntu-14.04-desktop-amd64.manifestファイル(ここではUbuntu 14.04用)を使用します/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ファイルに含まれるすべてが含まれていないため、マニフェストファイルのみを使用しても機能しません(チェックしました)。


7
/var/log/installer/initial-status.gz不足しているため、これは私のために動作しませんでした。また、これがaptsのマーキングに依存しているかどうかを知りたいmanualですか?
アンワー

1
残念ながら、サーバーバージョンのマニフェストはありません。
アンティハパラ

showmanual以下のコマンドを実行しました。そしてcomm、2つの(ソートされた)リストを比較するために使用します。そのshowmanual結果、このメソッドでは表示されない1,840個以上のユニークなパッケージが得apt-mark showmanualられました。パッケージは、このcomm-command の出力に固有のものではありません。私のPCの場合、894個のパッケージが両方の結果にリストされていることを記録する方が興味深いと思います。なぜそんなに大きな矛盾があるのか​​はわかりません。いくつかの(多くの?)パッケージはリリース固有のようです。XOrg、GTKコンポーネントなどのようなlib*ものは更新される可能性があります。 とにかく、この答えは非常に良いスタートです。
意志

あなたのソリューションとを比較しましたapt-mark showmanual。どれだけ多くの違いが見えるかは興味深いです。リストには238個のパッケージがあり、showmanualは1717個のパッケージを返します。2179個のインストール済みパッケージのうち、両方のリストには223個のみ、15個はあなたのもの(例:nodejs、lightdm)、223個はshowmanual(例:xser​​ver-xorg、ubuntu-desktop)のみです。あなたのリストはもっと役立つように感じますが、これらの違いがどこから来たのか分からないので、決めるのは簡単ではありません...(しかし、nginxとlightdmを手動でインストールしたと確信しています...)[ごめんなさい同じ;)]
ダニエルアルダー

64

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

apt-mark showmanual

35
これは、手動でインストールしたよりも多くのパッケージを示しています。
ウマン14

1
@Umangそうですね。この答えを書いたとき、これはこうではなかったと思います。私のシステムでは、linux-image-3.11.0-*-generic他をマニュアルとみなす理由はありません
ダニエルアルダー14

1
@Umangは多分これはあなたを助けるaskubuntu.com/questions/432743/...が、答えは受け付けられません。事実、新規インストールの多くのパッケージは既に手動としてマークされています。しかし、まだいくつかの奇妙なことがあります。私の例にとどまるには:linux-image-3.13.0-24-generic手動ですが、電流linux-image-3.13.0-27-genericは自動です。(この場合、参照元のパッケージのアップグレードと思われるlinux-image-generic依存関係を変更し、)、取扱説明書のマークが自動的に設定されている
ダニエル・アルダー

5
@DanielAlder新規インストールの一部のパッケージは、手動としてマークする必要があります。パッケージが手動としてマークされていない場合、システム全体をで削除できますapt-get autoremove。これは間違いなくあなたが望むものではありません。
アントンK

2
「手動インストール」が「最初のOSインストール後にユーザーによってインストールされる」ことを意味する場合、これは正しい答えではありません。
シーマス

21

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

例えば:

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

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

出力例

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


1
長年にわたるすべての回答の中で、これは18.04サーバーで近づいている唯一のものです。
クエンティン・スコウセン

20

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

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


aptitude search手動でインストールされたパッケージだけでなく、すべてのパッケージを表示します(OPが望んでいたものだと思います)
オリ

1
@Oli:適性検索パターンを調べます。私がそこで使用しているパターンは、OPが望んでいるとおりに動作するはずです。
李Lo

私は走ったことを。インストールされていないパッケージの全負荷を表示します。
オリ

7
何かがこれで正しくない、私が使用しているaptitude search '!~M ~i'、それは1043パッケージをリストします。多くのパッケージを手動でインストールする方法はありません。
ThatGraemeGuy

これは間違いなく要求どおりに機能せず、プリインストールされたパッケージも印刷します。
-Irfy

9

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

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


よろしくお願いします。受け入れられた答えとは対照的に、これは実際に機能します。
-Irfy

いくつかのパッケージを見せてください---間違いなくそれらの多くが欠けています。
Rmano 14年

ここでも同じですが、インストールした直後に手動でインストールしたパッケージが間違いなく見つかりません。
デビッドリュングマディソン

sys.exit(1)without を使用するとimport sys、新しいバージョンのpythonでエラーが発生する場合があります。どちらかimport sysまたは使用exit(1)
Videonauth

7

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

apt list [option]

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

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

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

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

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


5

数人がコメントしているように、apt-mark showmanualは少しバグが多いようです(バグ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つのアイテムの非常に短いリストであり、正確ではないようです。


1
sys.exit(1)without を使用するとimport sys、新しいバージョンのpythonでエラーが発生する場合があります。どちらかimport sysまたは使用exit(1)
Videonauth

4

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

ここに画像の説明を入力してください

  1. 開いた Synaptic Package Manager

  2. に行く Status

  3. クリック Installed (manual)

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

残念ながらCustom Filtersfoobarパッケージが手動でインストールされたのか自動でインストールされたのかを知るオプションが見つかりませんでした。

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


2

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

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


1
いいえ。lifereaが自動インストール済みとしてマークされていることを見つけるために、そのファイルを簡単に調べました。私はapt-get install lifereaそれをインストールしませんでしたが、「手動でインストール済みとしてマークされた」という結果になるような出力が得られました。現在、lifereaはファイル内にありますが、次の行の0代わりにがあり1ます。また、正規表現パターンをの" foobar$"代わりにに変更する必要がありますfoobar
ウマン

それは本当だ。私のせいで、私のシステムには0の行はありませんが、まれに発生するはずです。念のため答えを更新します。
ハビエルリベラ

2

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

# 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代わりに使用できますsort | unique。以下のようapt-markなアーキテクチャを表示しない、あなたは、集合演算(または使用前にはdpkgの出力からそれを取り除く必要がありますdpkg-query -W -f='${Package}\n')。また、dpkgは現在インストールされていないパッケージをリストする場合があります。「desc」については、 `dpkg-query -W -f = '#$ {binary:Summary} \ n' $ packを使用できますが、これは高速です。
ジャルノ

ああ、apt-markいくつかのパッケージのアーキテクチャを表示するかもしれませんが、多くのパッケージは表示しませんdpkg -l
ジャルノ

apt-cache search遅い。help.ubuntu.com/community/ListInstalledPackagesByDateのようなものを使用して事前にインストールされた日付のリストを取得する方がより効率的かもしれません
-opticyclic

1

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
  • できるからロックアウトします。

dpkgはしばしばインストールされていないパッケージを表示するので、これが正確だとは
思わ

私はあなたが何を意味するか知っていますが、私のbash-fuは十分に強くありません。dpkg-queryからステータスを表示し、それをgrepしてから、ステータスを切り取ることができると思います。行くよ。
オリ

comm -3 <(dpkg -l | grep '^ii' | cut -d \ -f 3|sort) <(apt-mark showauto|sort)適切に良いです;)
LassePoulsen

-1

これにより、依存関係、アンインストールされたパッケージ、システムのインストール中にインストールされたパッケージのない、手動でインストールされたすべてのパッケージがリストされます。

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
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.