インストール日ごとにインストール済みパッケージを一覧表示するにはどうすればよいですか?
debian / ubuntuでこれを行う必要があります。他のディストリビューションへの回答もいいでしょう。
特定のコードをコンパイルするためにたくさんのものをインストールしましたが、インストールしなければならなかったパッケージのリストを取得したいと思います。
コメント
- apt-getインストールの履歴を取得する方法も参照してください。
- “適切なリリース日”を探していましたが、運が悪かったので、このコメントは将来のグーグルに役立つかもしれません。
- askubuntu.com “インストールされているすべてのパッケージを一覧表示する方法” 。
回答
RedHatのようなRPMベースの配布は簡単です。
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.*
ファイルはログローテーションによって削除されるため、その方法はありません。 “システムの全履歴を提供することが保証されています。
数回表示される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のトリックには、選択されたパッケージだけでなく、インストールされているすべてのパッケージが含まれますが、’良いスタートです。
half-installed
エントリが削除されます):grep install\ /var/log/dpkg.log
grep " install " /var/log/dpkg.log
には、「ステータス」行ではなく「インストール」行のみが表示されます。回答
マイケルは、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
説明:
-
ls -rt
はファイルを並べ替えて出力します日付を逆の順序で変更します。つまり、リストの最後に最新のファイルを配置します。 -
stat
はファイルを出力します。人間が読める形式の日付。 -
printf
には、パッケージ名と最後に変更された日付が表示されます。 -
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でそれを達成しました:
- パッケージを一覧表示します。
- すべての標準入力を読み取ります。
- 完全に保存します。 “%n |%y “の形式のパス(パス|作成日)を変数に入力します。
- ファイルの名前を変数に格納します
- 前の両方のコマンドが正常に実行された場合、値は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
よろしくお願いします