web-dev-qa-db-ja.com

明示的にインストールされたパッケージのリスト

Gentooには、私が明示的にインストールしたパッケージを含む/var/lib/portage/worldファイルがあります。明示的に言うと、私が選択したパッケージで、デフォルトでインストールされているものや、依存関係によって取り込まれたものは含まれていません。

Ubuntuでその情報を見つけるための同様のファイルまたはコマンドはありますか?

53
phunehehe

コードだけ

aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currentlyinstalled.txt
wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-AMD64.manifest \
  | cut -f1 | sort -u > defaultinstalled.txt
comm -23 currentlyinstalled.txt defaultinstalled.txt

説明

この問題について考える1つの方法は、これを3つの部分に分けることです。

  • 依存関係としてインストールされていないパッケージのリストを取得するにはどうすればよいですか?
  • デフォルトでインストールされているパッケージのリストを取得するにはどうすればよいですか?
  • これらの2つのリストの違いを取得するにはどうすればよいですか?

依存関係としてインストールされていないパッケージのリストを取得するにはどうすればよいですか?

次のコマンドは私のシステムで動作するようです:

$ aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currentlyinstalled.txt

同様のアプローチは、Gillesが質問へのコメントとして投稿したリンクにもあります。一部の情報源は、これはaptitudeを使用してパッケージをインストールした場合にのみ機能すると主張しています。ただし、aptitudeを使用してパッケージをインストールすることはほとんどなく、これでも機能することがわかりました。 --disable-columns aptitudeがパッケージ名の行に空白を埋め込んで、以下の比較を妨げないようにします。 | sort -uファイルを並べ替え、重複を削除します。これにより、最終ステップがはるかに簡単になります。

デフォルトでインストールされているパッケージのリストを取得するにはどうすればよいですか?

注:このセクションは、説明に役立つと思う「間違ったパス」から始まります。 2番目のコードは機能するコードです。

これは少しトリッキーです。最初は、メタパッケージubuntu-minimal、ubuntu-standard、ubuntu-desktop、およびさまざまなLinuxカーネル関連パッケージの依存関係であるすべてのパッケージが適切な近似であると当初は考えていました。グーグル検索のいくつかの結果は、このアプローチを使用しているようです。これらの依存関係のリストを取得するために、私は最初に以下を試しました(動作しませんでした)。

$ apt-cache depends ubuntu-desktop ubuntu-minimal ubuntu-standard linux-* | awk '/Depends:/ {print $2}' | sort -u

これは、私がデフォルトで来なければならなかったことがわかっているいくつかのパッケージを除外しているようです。メタパッケージの正しいリストを作成すれば、この方法がうまくいくと私はまだ信じています。

ただし、Ubuntuミラーには、デフォルトのインストールのすべてのパッケージを含む「マニフェスト」ファイルが含まれているようです。 Ubuntu 12.04.3のマニフェストは次のとおりです。

http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-AMD64.manifest

このページ(または近くにあるミラーのページ)を検索すると、次のようになります。

http://mirror.pnl.gov/releases/precise/

使用しているバージョンとアーキテクチャに対応する「.manifest」ファイルを見つけることができるはずです。パッケージ名だけを抽出するには、次のようにしました。

wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-AMD64.manifest | cut -f1 | sort -u > defaultinstalled.txt

リストは既に並べ替えられていて一意である可能性がありますが、次のステップを簡単にするために、適切に並べ替えられていることを確認しました。次に、出力をdefaultinstalled.txt

これらの2つのリストの違いを取得するにはどうすればよいですか?

ほとんどのUnixライクなシステムには、これを行うための多くのツールがあるため、これは最も簡単な部分です。 commツールは、これを行う多くの方法の1つです。

comm -23 currentlyinstalled.txt defaultinstalled.txt

これにより、最初のファイルに固有の行のリストが出力されます。したがって、デフォルトのインストールにないインストール済みパッケージのリストを出力する必要があります。

46
Steven D

これら2つのワンライナーのいずれかを使用できます。どちらも私のマシンでまったく同じ出力を生成し、この質問でこれまで(2014年7月)提案されたすべてのソリューションよりも正確です。これらは、2つの回答 (1) および (2) の組み合わせです。最初にこの回答 here を投稿したことに注意してください。

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ファイル( ここでは Ubuntu 14.04の場合)を使用します。それ以外のパッケージが手動でインストールされたものとして表示されます。
  • apt-mark showautoの代わりに/var/log/installer/initial-status.gzを使用します。たとえばapt-markにはxserver-xorgパッケージは含まれていませんが、他のファイルには含まれています。

どちらも上記のソリューションよりも多くのパッケージをリストしています。

24
jmiserez

による man apt-mark

apt-mark showauto
apt-mark showmanual
9
mmaruska

cat /var/log/apt/history.logのサンプル出力は次のとおりです。

Start-Date: 2011-01-22  00:43:38
Commandline: apt-get --target-release experimental install libdbus-1-dev
Upgrade: libdbus-1-3:i386 (1.4.0-1, 1.4.1-1), libdbus-1-dev:i386 (1.4.0-1, 1.4.1-1)
End-Date: 2011-01-22  00:43:48

Start-Date: 2011-01-23  01:16:13
Commandline: apt-get --auto-remove purge webcheck
Purge: python-utidylib:i386 (0.2-6), python-beautifulsoup:i386 (3.1.0.1-2), libtidy-0.99-0:i386 (20091223cvs-1), webcheck:i386 (1.10.3)
End-Date: 2011-01-23  01:16:31

あなたの質問については、grep(cat /var/log/apt/history.log | grep Commandline)でフィルタリングしてください。

これらのファイルはローテーションされることに注意してください。他のファイルをチェックして、見逃さないようにしてください。

$ ls /var/log/apt/history.log*
-rw-r--r-- 1 root root 69120 2011-01-23 18:58 /var/log/apt/history.log
-rw-r--r-- 1 root root 19594 2011-01-01 02:48 /var/log/apt/history.log.1.gz

[〜#〜]ノート[〜#〜]

  • aptitudesynaptic(それぞれバージョン.7.6.)の両方を確認しましたが、どちらもログに記録されましたそのログファイルでのアクティビティ。それらの欠点の1つは、Commandlineで始まる行がないため、grepトリックがそれらで機能しないことです。
8
tshepang

このクエリを検索しているときに、この美しいワンライナーに出会いました

ワンライナーは

comm -13 \
  <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
  <(comm -23 \
    <(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
    <(apt-mark showauto | sort) \
  )`

このonelinerは、/var/log/installer/initial-status.gzのログを使用して、システムによってインストールされたパッケージをフィルタリングします

このワンライナーは私のものではなく、どこで見たのか思い出せないので、見つけたときに元のスレッドへのリンクを投稿します。

7
Archit

この記事 をご覧ください。

記事の最後に、pythonスクリプトがあり、必要な処理を実行できます。

(k)ubuntuのために書かれました。 Ubuntuでも機能するはずです。

3
Stefan

以下は スティーブンDの回答 への追加です。

次の行は、パッケージ名を32文字で切り捨てているようです。

aptitude search '~i !~M' | cut -d" " -f4 | sort -u > currentlyinstalled.txt

これはうまくいくようです:

aptitude search '~i !~M' -F "%p" > sort -u > currentlyinstalled.txt

参照 この答え

2
Wes Turner

チェックアウト /var/log/apt/term.log

1
Joril

ファイル/var/lib/apt/extended_states

cat /var/lib/apt/extended_states | grep -B2 'Auto-Installed: 0'

これは、古いパーティションに何がインストールされているかを知りたい場合に便利です。

1
Laurent Lyaudet

スクリプトのその宝石を思いついた人に大きな感謝とお祝いを!
2¢を追加したかったので、$ infoから推測したインストール日を追加しました。
$ infoファイルが更新される理由とタイミングを詳細に習得しませんでしたが、実際には機能します。
私のスクリプトには、インストール後に追加された非依存パッケージの最新の更新が一覧表示されています。
定期的なチェックを行ったところ、手動​​でログに記録しておけば、1回もミスすることはありませんでした。
つまり、同じ理由でインストールされたパケットのバッチ。残念ながら、更新はその順序に違反します。
システムのアップグレード後、アップグレードが更新しなかった追加パッケージのリストがあり、その後に更新したパッケージが続きました。
きちんと!楽しい。

info='/var/lib/dpkg/info/'

comm -13 > /tmp/packages \
  <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
  <(comm -23 \
    <(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
    <(apt-mark showauto | sort) \
  )

while read n; do
  echo $(ls -ltr --time-style=long-iso $info$n.* $info$n:i386.* $info$n:AMD64.* 2>/dev/null \
    | tail -n 1 | Perl -pe 's/.*([0-9]{4}?-.*:[0-9]{2}?).*/\1/') $n
done < /tmp/packages | sort
0
Papou