Gentooには、私が明示的にインストールしたパッケージを含む/var/lib/portage/world
ファイルがあります。明示的に言うと、私が選択したパッケージで、デフォルトでインストールされているものや、依存関係によって取り込まれたものは含まれていません。
Ubuntuでその情報を見つけるための同様のファイルまたはコマンドはありますか?
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つの部分に分けることです。
次のコマンドは私のシステムで動作するようです:
$ 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
。
ほとんどのUnixライクなシステムには、これを行うための多くのツールがあるため、これは最も簡単な部分です。 comm
ツールは、これを行う多くの方法の1つです。
comm -23 currentlyinstalled.txt defaultinstalled.txt
これにより、最初のファイルに固有の行のリストが出力されます。したがって、デフォルトのインストールにないインストール済みパッケージのリストを出力する必要があります。
これら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
どのように機能するのですか
sed
は行末の残りの空白を取り除きます。他の可能性も機能しません:
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パッケージは含まれていませんが、他のファイルには含まれています。どちらも上記のソリューションよりも多くのパッケージをリストしています。
による man apt-mark
:
apt-mark showauto
apt-mark showmanual
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
[〜#〜]ノート[〜#〜]:
Commandline
で始まる行がないため、grep
トリックがそれらで機能しないことです。このクエリを検索しているときに、この美しいワンライナーに出会いました
ワンライナーは
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
のログを使用して、システムによってインストールされたパッケージをフィルタリングします
このワンライナーは私のものではなく、どこで見たのか思い出せないので、見つけたときに元のスレッドへのリンクを投稿します。
以下は スティーブンDの回答 への追加です。
次の行は、パッケージ名を32文字で切り捨てているようです。
aptitude search '~i !~M' | cut -d" " -f4 | sort -u > currentlyinstalled.txt
これはうまくいくようです:
aptitude search '~i !~M' -F "%p" > sort -u > currentlyinstalled.txt
参照 この答え
チェックアウト /var/log/apt/term.log
ファイル/var/lib/apt/extended_states
。
cat /var/lib/apt/extended_states | grep -B2 'Auto-Installed: 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