web-dev-qa-db-ja.com

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

インストール日別にインストール済みパッケージをリストするにはどうすればよいですか?

これはdebian/ubuntuで行う必要があります。他のディストリビューションの回答もいいでしょう。

特定のコードをコンパイルするためにたくさんのものをインストールしましたが、インストールしなければならないパッケージのリストを取得したいと思っています。

106

Red HatのようなRPMベースのディストリビューションは簡単です。

rpm -qa --last

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

grep install /var/log/dpkg.log

ログファイルがローテーションされていない限り、次のことを試してください。

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

一般的に、dpkgaptは、dpkg-queryのマニュアルページにそのようなフィールドがないため、インストール日を追跡していないようです。

そして、最終的に古い/var/log/dpkg.log.*ファイルはログローテーションによって削除されるため、その方法でシステムの全履歴が保証されるわけではありません。

数回表示される提案(例: this thread )は、/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日間にインストール(変更?)された選択のみを一覧表示します。

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

68
Mikel

Mikelはdpkgレベルでこれを行う方法を示しています 。特に、 /var/lib/dpkg/info/$packagename.listは、パッケージのインストール時に作成されます(後で変更されることはありません)。

APTツールを使用した場合(おそらく、自動でインストールされたパッケージと手動でインストールされたパッケージを懸念しているために使用したツール)、/var/log/apt/history.log。回転していない限り、すべてのAPTインストール、アップグレード、削除を追跡し、自動的にインストールされたものとしてマークされたパッケージの注釈が付いています。これは、 APT 0.7.26なので、Debianではsqueezeで表示されました。Ubuntuでは10.04にhistory.logですが、自動インストールされたアノテーションは10.10まで存在しません。

ラフですが動作します:

for fillo in `ls -tr /var/lib/dpkg/info/*.list` ; 
    do basename ${fillo} | sed 's/.list$//g' ; 
done > forens.txt

ls -ltr /var/lib/dpkg/info/*.list > forentime.txt

for lint in `cat forens.txt` ; do 
    echo -n "[ ${lint} Installed ] : " ; 
    echo -n "`grep /${lint}.list forentime.txt | awk '{ print $6, $7, $8 }'` : " ; 
    ( ( grep -A3 " ${lint}$" /var/lib/apt/extended_states | \
        grep '^Auto' > /dev/null ) && echo "Auto" ) || echo "Manual" ; 
done > pkgdatetime.txt
6
Dulantha

/var/log/apt/history.logファイルの形式が面倒です。

Start-Date:{date} {time} Commandline:{command} {options ...} Install:{package(version)}、...、{package(version)}、... End-Date:{date } {時間}

私はもっ​​とログファイル形式のレコードを好んだでしょう

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

または、{package}だけでなくすべての{dependencies}を示すXML。

現在実装されているように、探している情報を見つけることができますが、詳細を抽出するにはフォレンジック処理が必要です。

4
Saint DanBert

これは、Debianシステムで動作します。ファイル形式が2011年から変更されていると思います。このシステムはかなり新しいので、古いシステムで動作することはないと思います。ただし、ログを解凍して使用するだけです。それらすべてを参照するグロブ。

grep 'install ' /var/log/dpkg.log.1 | sort | cut -f1,2,4 -d' '

ファイルの各行の最初の2つのフィールド/var/log/dpkg.logは日付と時刻です。 grepの部分にあるinstallの末尾のスペースに注意してください。これは、アップグレードによってインストールがトリガーされる可能性があるためですが、私が正しく理解していれば、ユーザーが何をインストールしたかを知りたいと思っています。

3
Amias

ここに誰もが欲し、必要とするワンライナーがあります:

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

結果には、すべての(新規)installedおよびupgradedパッケージが時系列で表示されます注文。

行の説明:

  • ls -1t - すべて取得 dpkg.log*時系列のファイル名
  • zcat -f-[〜#〜] if [〜#〜]ファイルのタイプはgzipで、解凍して- [〜#〜] else [〜#〜]コンテンツを渡すだけです。
  • tac-catの出力を1行ずつ逆にして、正しい時系列順になるようにします。
  • grep-installedまたはupgradeパッケージのみをチェックします。
  • awk -F ':a'-architectureフィールドをパッケージ名から分離します
  • column -t-スペースで区切られた列をきれいに出力します

もちろんこれにエイリアスを作成したいのですが、awkが一重引用符と二重引用符の両方に依存しているため、残念ながら不可能です。この点で、これは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システムではテストされていません
2
not2qubit

GNU/Linux Debianにはこの問題の組み込みツールはありませんが、標準的な方法でインストールされたプログラムに関するすべての情報は、program-name.listでファイルに保存されます場所/ var/lib/dpkg/info /にあります。 ただし、手動でインストールされたプログラムに関する情報はありません。


長い単一行のソリューション

for file_list in `ls -rt /var/lib/dpkg/info/*.list`; do \
    stat_result=$(stat --format=%y "$file_list"); \
    printf "%-50s %s\n" $(basename $file_list .list) "$stat_result"; \
done

説明

  1. ls -rtは、日付の変更によって逆順にソートされたファイルを出力します。つまり最新のファイルがリストの最後に表示されます。
  2. statは、ファイルの日付を人間が読める形式で出力します。
  3. printfは、パッケージ名とその最終変更日を表示します。
  4. forループは、全体として、パッケージ名と日付を古いものから新しいものへと出力します。

出力例(切り捨て):

.........................................
gnome-system-log                            2016-09-17 16:31:58.000000000 +0300
libyelp0                                    2016-09-17 16:32:00.000000000 +0300
gnome-system-monitor                        2016-09-17 16:32:00.000000000 +0300
Yelp-xsl                                    2016-09-17 16:32:01.000000000 +0300
Yelp                                        2016-09-17 16:32:03.000000000 +0300
gnome-user-guide                            2016-09-17 16:32:18.000000000 +0300
libapache2-mod-dnssd                        2016-09-17 16:32:19.000000000 +0300
.........................................
linux-compiler-gcc-4.8-x86                  2017-02-26 20:11:02.800756429 +0200
linux-headers-3.16.0-4-AMD64                2017-02-26 20:11:10.463446327 +0200
linux-headers-3.16.0-4-common               2017-02-26 20:11:17.414555037 +0200
linux-libc-dev:AMD64                        2017-02-26 20:11:21.126184016 +0200
openssl                                     2017-02-26 20:11:22.094098618 +0200
unzip                                       2017-02-26 20:11:23.118013331 +0200
wireless-regdb                              2017-02-26 20:11:23.929949143 +0200
nodejs                                      2017-02-26 20:11:33.321424052 +0200
nasm                                        2017-02-28 16:41:17.013509727 +0200
librecode0:AMD64                            2017-03-01 10:38:49.817962640 +0200
libuchardet0                                2017-03-01 10:41:10.860098788 +0200
tree                                        2017-03-04 14:32:12.251787763 +0200
libtar0                                     2017-03-07 09:51:46.609746789 +0200
libtar-dev                                  2017-03-07 09:51:47.129753987 +0200

このソリューションの主な欠点は、本番環境で十分にテストされていないことです。

1
PADYMKO

ラフですが、他のソリューションと同じようにすばやく動作します。日付形式はyyyymmddhhmmssです。これは、ビットまたは並べ替えと形式の削除により、並べ替え可能な数値になることを意味します。

他のソリューションのおかげで、このリストには、オペレーティングシステムのコピーを作成するために使用できるインストール順にパッケージ名がリストされています。

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 | awk '{print $2$3" "$1}' | sed '0,/RE/s/-//' \
| sed '0,/RE/s/-//' | sed '0,/RE/s/://' | sed '0,/RE/s/://' \
| sed '0,/RE/s/\\.//' | sed 's/:armhf//' | sort | awk '{print $2}'
1
Alexander Cave

これは、他の配布の回答も歓迎すると述べているためです。 rpmには大量の出力形式タグのセットがあり、その1つがINSTALLTIMEです。 (例としてwgetを使用)

rpm -qi wget --qf "%{NAME},%{INSTALLTIME}\n" | tail -n 1
wget,1454014156

これはいくつかの方法でフォーマットできます。私はそれをこのように使用します:

rpm -qi wget --qf "%{NAME},%{INSTALLTIME:date}\n" | tail -n 1
wget,Thu 28 Jan 2016 03:49:16 PM EST

これらの2つのページには、RPMメタデータの問題の解決に関する豊富な情報があります。

http://www.rpm.org/max-rpm/s1-rpm-query-parts.html

http://www.rpm.org/max-rpm/s1-rpm-query-handy-queries.html

この情報を並べ替えると、問題の解決策が得られます。

1
Jonathan Swift