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

インストール日ごとにインストール済みパッケージを一覧表示するにはどうすればよいですか?

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

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

コメント

回答

RedHatのような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.*ファイルはログローテーションによって削除されるため、その方法はありません。 “システムの全履歴を提供することが保証されています。

数回表示される1つの提案(例: このスレッド)は、/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 

何らかの理由でそれを ” sは私にとってあまり多くの違いを出力しないので、--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コマンドの方が効率的です。

コメント

  • 私は通常、iv id =よりもapt-getが好きです。 “56b96ca800”>

ですが、インストール日をデータベースに保存しないため、debianは-1を取得します。 Debianのトリックには、選択されたパッケージだけでなく、インストールされているすべてのパッケージが含まれますが、’良いスタートです。

  • Debianの場合次の場合は、無駄が少なくなります(half-installedエントリが削除されます):grep install\ /var/log/dpkg.log
  • @ Mikel-すばらしい答えです。 ‘収集/var/lib/dpkg/info/*.listファイル情報’を拡張し、すべてを除外するコードを追加しましたただし、”トップレベルパッケージ”(他のatpパッケージが依存しないatpパッケージ)。その< askubuntu.com/a/948532/723997 >投稿質問に答えます “手動で実行したapt-getinstallコマンドの履歴を表示するにはどうすればよいですか? “。
  • Debian / Ubuntu:grep " install " /var/log/dpkg.logには、「ステータス」行ではなく「インストール」行のみが表示されます。
  • aptもdpkgストアもインストール/変更された日時がない場合、2019年にはそれはかなり受け入れられないようです。まだマシン上にあるかどうかにかかわらず、greppingログファイルに依存していますか?これはどうですか?
  • 回答

    マイケルは、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まで存在しません。

    コメント

    • As Mikelは次のように指摘しました:”そして最終的に古い/var/log/dpkg.log.*ファイルはログローテーションによって削除されるため、’ tはシステムの全履歴を提供することを保証します。”。こちらをご覧ください< askubuntu.com/a/948532/723997 >現在のトップレベルパッケージ(他のパッケージが依存していないパッケージを意味する)を検出する方法についての回答

    回答

    大まかな、しかし機能する:

    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 

    コメント

    • ブー、からの出力を解析するためのヒスls。これが危険である/本質的にバグがある理由については、 mywiki.wooledge.org/ParsingLs を参照してください。より安全なオプションはfind -printfまたはstat --formatを使用して、明確に解析できるストリームを生成します。
    • @CharlesDuffyリンクはわかりやすいですが、簡単にするために

      が役立つはずです。さらに、誰かが名前に\n\t\r\vを含むAPTパッケージに名前を付けることはおそらく前例のないことです。

    回答

    これが誰もが望んでいるワンライナーです:

     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 IF ファイルが gzip タイプの場合、解凍して ELSE コンテンツを渡すだけです。
    • tac cat の逆出力、行ごとに、正しい年代順を取得していることを確認します。
    • grepインストール済みまたはのみを確認します>アップグレードパッケージ。
    • awk -F ":a"アーキテクチャフィールドをパッケージ名から分離します
    • 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システムでテストされていません

    回答

    /var/log/apt/history.logファイルの形式はIMHOです。

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

    よりログファイル形式のレコードが望ましい

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

    または{だけでなく表示するXMLパッケージ}、ただし{依存関係}。

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

    回答

    これは、 Debianシステム、2011年以降、ファイル形式が変更されたと思います。このシステムはかなり新しいので、古いシステムでは機能しないと思いますが、ログを解凍し、globを使用してすべてを参照する必要がある場合があります。

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

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

    コメント

    • まさに私がしていること。簡単。ただし、zgrepを使用すると、すべての.gzログがzgrep ‘ install ‘ /var/log/dpkg.logのように検索されます。 *。” install “という単語の前にスペースを入れて、厄介な”ハーフインストールを防ぎます。 “。パッケージ名フィールドを取得するには、cut-f1,5を使用する必要がありました。もちろん、最終的には古いログがローテーションします。

    回答

    GNU / LinuxDebianには組み込みツールがありませんこの問題については、標準的な方法でインストールされたプログラムに関するすべての情報が program-nameのファイルに保存されます。 / 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)’が非常に遅いことと、(2)次の場合にのみ表示されることです。パッケージが最後に更新されたのはであり、’以前のバージョンではありません。もちろん、これはワンライナーの問題ではありませんが、dpkgが’で/var/lib/dpkg/info/の履歴を追跡しない方法です。そのため、/var/log/dpkg.log*を使用することをお勧めします。

    回答

    他の配布の回答を歓迎すると述べているので、これに注意してください。 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

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

    回答

    大まかな方法ですが、他のソリューションと同じくらい速く機能します。日付形式は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}" 

    コメント

    • ようこそ@ alexander-cave! output を数行追加して、期待される出力の種類を確認できるようにしてください。

    回答

    aptでローテーションされたログファイルを使用すると、次のことができます。

    zcat -f /var/log/dpkg.log* | grep " install " | less 

    回答

    次のコマンドを使用してKubuntuでそれを達成しました:

    1. パッケージを一覧表示します。
    2. すべての標準入力を読み取ります。
    3. 完全に保存します。 “%n |%y “の形式のパス(パス|作成日)を変数に入力します。
    4. ファイルの名前を変数に格納します
    5. 前の両方のコマンドが正常に実行された場合、値は1行で出力されます。
    ls /var/lib/dpkg/info/*.list |while read xfile; do wpath=$(stat -c "%n|%y" ${xfile}) && wfile=$(basename ${xfile}) && printf "${wfile}|${wpath}\n" ;done 

    よろしくお願いします

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です