インストール日別にインストール済みパッケージをリストするにはどうすればよいですか?
これはdebian/ubuntuで行う必要があります。他のディストリビューションの回答もいいでしょう。
特定のコードをコンパイルするためにたくさんのものをインストールしましたが、インストールしなければならないパッケージのリストを取得したいと思っています。
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
一般的に、dpkg
とapt
は、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
コマンドをより効率的にすることもできます。
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
/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。
現在実装されているように、探している情報を見つけることができますが、詳細を抽出するにはフォレンジック処理が必要です。
これは、Debianシステムで動作します。ファイル形式が2011年から変更されていると思います。このシステムはかなり新しいので、古いシステムで動作することはないと思います。ただし、ログを解凍して使用するだけです。それらすべてを参照するグロブ。
grep 'install ' /var/log/dpkg.log.1 | sort | cut -f1,2,4 -d' '
ファイルの各行の最初の2つのフィールド/var/log/dpkg.log
は日付と時刻です。 grepの部分にあるinstallの末尾のスペースに注意してください。これは、アップグレードによってインストールがトリガーされる可能性があるためですが、私が正しく理解していれば、ユーザーが何をインストールしたかを知りたいと思っています。
ここに誰もが欲し、必要とするワンライナーがあります:
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
欠点:
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
説明:
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
このソリューションの主な欠点は、本番環境で十分にテストされていないことです。
ラフですが、他のソリューションと同じようにすばやく動作します。日付形式は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}'
これは、他の配布の回答も歓迎すると述べているためです。 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
この情報を並べ替えると、問題の解決策が得られます。