インストール日ごとに適切なベースシステムのパッケージを一覧表示する

インストール日ごとに適切なベースシステムのパッケージを一覧表示する

インストール日ごとにインストールされたパッケージを一覧表示するには?

Debian/Ubuntu でこれを行う必要があります。他のディストリビューションへの答えも良いです。

特定のコードをコンパイルするために多くをインストールしましたが、インストールする必要があるパッケージのリストを取得したいと思います。

答え1

RPMベースの展開(Red Hatなど)は簡単です。

rpm -qa --last

Debianやその他のdpkgベースのディストリビューションでは、特定の質問も簡単です。

grep install /var/log/dpkg.log

ログファイルが置き換えられていない場合は、以下を試してください。

grep install /var/log/dpkg.log /var/log/dpkg.log.1

通常、マニュアルページに対応するフィールドがないため、dpkgインストールapt日は追跡されないようですdpkg-query

結局のところ、古い/var/log/dpkg.log.*ファイルはログ循環を通して削除されるため、このアプローチはシステムの完全な履歴を提供することを保証できません。

何度も表示される提案(例:このスレッド/var/lib/dpkg/info)ディレクトリを見てください。この記事では、次のことを試すことができることを示唆しています。

ls -t /var/lib/dpkg/info/*.list | sed -e 's/\.list$//' | head -n 50

選択に関する質問に答えるための最初のステップは次のとおりです。

日付別にパッケージリストを作成する

$ find /var/lib/dpkg/info -name "*.list" -exec stat -c $'%n\t%y' {} \; | \
    sed -e 's,/var/lib/dpkg/info/,,' -e 's,\.list\t,\t,' | \
    sort > ~/dpkglist.dates

インストール済みパッケージのリストの作成

$ dpkg --get-selections | sed -ne '/\tinstall$/{s/[[:space:]].*//;p}' | \
    sort > ~/dpkglist.selections

リストを2つ追加

$ join -1 1 -2 1 -t $'\t' ~/dpkglist.selections ~/dpkglist.dates \
    > ~/dpkglist.selectiondates

何らかの理由でそれは私に多くの違いを印刷しないので、バグがあるか、意味に間違った仮定があるかもしれません--get-selections

find . -mtime -<days>head -n <lines>必要に応じて、明らかにパッケージを使用または制限し、出力形式を変更できます。

$ find /var/lib/dpkg/info -name "*.list" -mtime -4 | \
    sed -e 's,/var/lib/dpkg/info/,,' -e 's,\.list$,,' | \
    sort > ~/dpkglist.recent

$ join -1 1 -2 1 -t $'\t' ~/dpkglist.selections ~/dpkglist.recent \
    > ~/dpkglist.recentselections

過去4日以内にインストールされた(変更?)選択肢のみが一覧表示されます。

sort使用されたソート順を確認したら、コマンドを削除してコマンドをより効率的にすることもdpkg --get-selectionsできます。find

答え2

Mikelはdpkgレベルでこれを行う方法を示しました。。特に/var/lib/dpkg/info/$packagename.listパッケージがインストールされたときに作成されます(以降は変更されません)。

APTツールを使用したことがある場合は(自動インストールされたパッケージと手動でインストールされたパッケージについて心配していたために使用したことがあります)、回転しない限り、すべての/var/log/apt/history.logAPTをインストール、アップグレード、および削除し、サイレントインストールとしてマークされたパッケージの説明を提供します。これはAPT 0.7.26で導入されたかなり新機能なので、Debianではsqueezeとして表示されます。 Ubuntuには10.04にありますが、サイレントhistory.logインストールに関する注意事項は10.10まで表示されません。

答え3

誰もが欲しく、必要な引用は次のとおりです。

for x in $(ls -1t /var/log/dpkg.log*); do zcat -f $x |tac |grep -e " install " -e " upgrade "; done |awk -F ":a" '{print $1 " :a" $2}' |column -t

結果にはすべて(新規)が表示されます。インストール済みそしてアップグレードされたバージョンパッケージは時系列でソートされます。

この行では、以下を説明します。

  • ls -1t-dpkg.log*すべてのファイル名を時系列で取得します。
  • zcat -f-もしファイルはアーカイブ入力してから解凍してください。その他内容を渡すだけです。
  • tac- リバース出力、1行ずつ正しい時間順序を取得できるようにします。
  • grep- 確認のみ可能インストール済みまたはアップグレードバッグ。
  • awk -F ':a'- 分離建築学パッケージ名のフィールド
  • column -t- スペースで区切られた列のきれいな印刷

もちろん、これに対するエイリアスを作りたいのですが、残念ながらこれは不可能です。アッ一重引用符と二重引用符によって異なります。これに関しては、これをbashスクリプトに入れる方が良い:でしょう。建築学フィールド列に。

出力は次のとおりです

2018-03-06  18:09:47  upgrade  libgomp1                     :armhf  6.3.0-18+rpi1                 6.3.0-18+rpi1+deb9u1
2018-03-05  15:56:23  install  mpg123                       :armhf  <none>                        1.23.8-1
2018-03-05  15:56:23  install  libout123-0                  :armhf  <none>                        1.23.8-1
2018-01-22  17:09:45  install  libmailtools-perl            :all    <none>                        2.18-1
2018-01-22  17:09:44  install  libnet-smtp-ssl-perl         :all    <none>                        1.04-1

税の払い戻し:

  • 上記のようにARMアーキテクチャにのみ適用可能で、アーキテクチャフィールドの区切り文字を少し変更する必要があります。
  • エイリアスの使用を容易にするには、スクリプトに入れる必要があります。
  • 他の *nix システムではテストされていません。

答え4

IMHO/var/log/apt/history.logファイル形式が厄介です。

開始日:{日付} {時間}コマンドライン:{command} {オプション...}インストール:{パッケージ(バージョン)}、...、{パッケージ(バージョン)}、...終了日:{日付} {時間}

ログファイル形式でログインすることを好む

{date}{time}{tab}{package}{tab}{version}{tab}{command}{options}\n

または、{package}だけでなく、すべての{依存関係}を表示するいくつかのXMLです。

現在実装されているため、必要な情報を取得できますが、詳細を抽出するには少しフォレンジック処理が必要です。

関連情報