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


53

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

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

回答:


46

コードだけ

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

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


最初のパイプラインでは何ができaptitude search '~i!~M' -F %pませんか?
一時的な

@ephemient:おそらく何もありません。私はaptitudeについてあまり知らないので、決して使用しないプログラムのmanファイルを掘り下げるのではなく、使い慣れたツールを使用しました。
スティーブンD

1
あなたは私の希望を破壊するようなもので、標準的な簡単な方法があると思った:(
phunehehe

3
これはほとんど機能しますが、まだ正しくありません。結果リストには、手動でインストールしなかった複数のパッケージとライブラリが含まれています。私http://releases.ubuntu.com/releases/trusty/ubuntu-14.04-desktop-amd64.manifestは追加| sed "s/ *$//"のサイコロを使用しましたが、まだサイコロはありません。
jmiserez

1
依存関係としてインストールされていないパッケージのリストを取得する最初のステップは、apt-mark showmanual | sort -u他の回答に示されているように、に置き換えることができます。よりシンプルで、aptitudeデフォルトでインストールされていないものに依存しません。
-skagedal

24

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

を使用して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パッケージは含まれませんが、他のファイルは含まれます。

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


最初のインストール以降にシステムをアップグレードした場合(これは私が考えるほとんどの人に当てはまります)、現在のUbuntuリリースバージョンのマニフェストファイルを使用する方が適切です。
ディエゴV

アップグレードした場合、マニフェストファイルだけでなく、両方のファイルを使用する必要があると思います。別の比較を追加するだけで簡単にできます。残念ながら、マニフェストファイルにはinitial_status.gzファイルに含まれるすべてが含まれているわけではありません(チェックしました)。
jmiserez

私が感銘を受けた!しかし、私は行方不明の作品を見つけました。何されたパッケージについて最初にインストールしたが、その後、明示的に手動で削除、しかし、後に明示的に手動で再インストール?私はこれを稼働中のシステムで見つけました。
n611x007

1
私は質問作ったリスト(傾向)明示的に削除パッケージ:unix.SE/225330仕事の大部分に対処するために。
n611x007

1
これは、承認されたソリューションのmirror.pnl.gov/releases/precise / ... URLが404になったため、承認されたソリューションよりも優れています
。– rmunn

9

によるとman apt-mark

apt-mark showauto
apt-mark showmanual

2
showmanualのようなものを表示していますがxserver-xorg-video-vesa、手動ではインストールしなかったと断言します。
プネヘヘ

おそらく最初のインストール時にディストリビューションによって自動的にインストールされます。
マット

8

のサンプル出力を次に示します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(それぞれバージョン0.700.6.3)の両方をチェックしましたが、両方ともそのログファイルにアクティビティを記録します。それらの1つの欠点は、で始まる行がないCommandlineため、grepトリックが機能しないことです。

2
興味深いソリューション。パッケージのリストを取得しaptitude、他のパッケージマネージャーによってインストールされたパッケージを考慮するために、grepコマンドを少し調整する必要があります。あなたのログが回転してなくなった場合、それであなたは運が悪いです。
スティーブンD

@stevenが更新されました。私のgrep-fuは初心者なので、読者にお任せします。また、物が回転するかどうかもわかりません。自分でそこにファイルするだけです。
シェパン

それらが回転するかどうかは、logrotateのセットアップとシステムが使用されている時間に依存します。Ubuntuのデフォルトを変更してから長い時間が経過しているため、Ubuntuのデフォルトが不明です。
スティーブンD

7

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

1つのライナーは

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

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


3

あなたは見ていたいと思うこの記事を

記事の最後に、あなたがやりたいことをするPythonスクリプトがあります。

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


3
リンクは機能していないようです。
ロッグ

2
このようなリンク切れは、関連情報を回答に含めることが重要な理由です。
whitehat101

2

以下は、Steven Dの回答への追加です。

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

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

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

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

この答えを見てください


1

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


2
それは、物事を行うにはかなり痛みを伴う方法だ、と私は自分自身をインストールするパッケージ間の区別はありません、そして、それらの依存関係によって引っ張ら
phunehehe

私は同意しますが、aptがそれらを追跡していることを知りませんでした:/今ではStefanに感謝します:)
Joril

1

ファイルもご覧ください/var/lib/apt/extended_states

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

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


0

スクリプトのあの逸品を思いついた人に大いに感謝し、おめでとうございます!!!
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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.