回答:
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
これにより、最初のファイルに固有の行のリストが出力されます。したがって、デフォルトのインストールにないインストール済みパッケージのリストを印刷する必要があります。
http://releases.ubuntu.com/releases/trusty/ubuntu-14.04-desktop-amd64.manifest
は追加| sed "s/ *$//"
のサイコロを使用しましたが、まだサイコロはありません。
apt-mark showmanual | sort -u
他の回答に示されているように、に置き換えることができます。よりシンプルで、aptitude
デフォルトでインストールされていないものに依存しません。
これら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
仕組み
sed
は行の終わりに残っている空白を取り除きます。他の可能性もうまくいきません:
ubuntu-14.04-desktop-amd64.manifest
ファイル(ここではUbuntu 14.04用)を使用します/var/log/installer/initial-status.gz
。より多くのパッケージは、手動ではインストールされていないと表示されます。apt-mark showauto
代わりに使用します/var/log/installer/initial-status.gz
。apt-mark
たとえば、xserver-xorgパッケージは含まれませんが、他のファイルは含まれます。どちらも上記のソリューションよりも多くのパッケージをリストします。
のサンプル出力を次に示します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
トリックが機能しないことです。aptitude
、他のパッケージマネージャーによってインストールされたパッケージを考慮するために、grepコマンドを少し調整する必要があります。あなたのログが回転してなくなった場合、それであなたは運が悪いです。
このクエリを検索しているときに、この美しいワンライナーに出会いました
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
このワンライナーは私のものではなく、どこで見たのか思い出せないので、見つけたときに元のスレッドへのリンクを投稿します。
以下は、Steven Dの回答への追加です。
次の行は、パッケージ名を32文字で切り捨てているように見えます。
aptitude search '~i !~M' | cut -d" " -f4 | sort -u > currentlyinstalled.txt
これはうまくいくようです:
aptitude search '~i !~M' -F "%p" > sort -u > currentlyinstalled.txt
この答えを見てください
スクリプトのあの逸品を思いついた人に大いに感謝し、おめでとうございます!!!
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
aptitude search '~i!~M' -F %p
ませんか?