Kurulum tarihine göre apt tabanlı bir sistemde paketleri listeleme


104

Kurulu paketleri kurulum tarihine göre nasıl listeleyebilirim?

Bunu Debian / Ubuntu'da yapmam gerekiyor. Diğer dağıtımlara verilen cevaplar da iyi olurdu.

Belirli bir kod parçasını derlemek için çok şey yükledim ve yüklemem gereken paketlerin bir listesini almak istiyorum.



1
Şans olmadan "apt sürüm tarihi" için googling oldu, belki bu yorum gelecekteki googlers yardımcı olacaktır.
ThorSummoner

Yanıtlar:


66

Red Hat gibi RPM tabanlı dağıtımlar kolaydır:

rpm -qa --last

Debian ve diğer dpkg tabanlı dağıtımlarda, sizin de sizin probleminiz çok kolaydır:

grep install /var/log/dpkg.log

Günlük dosyası döndürülmediyse, bu durumda denemelisiniz:

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

Genel olarak dpkgve man sayfasındaki aptböyle bir alanın bulunmaması nedeniyle kurulum tarihini takip etmiyor gibisiniz dpkg-query.

Ve nihayetinde eski /var/log/dpkg.log.*dosyalar log dönüşümü ile silinecek, bu şekilde sisteminizin bütün tarihini size bildirmeniz garanti edilemez.

Birkaç kez görünen bir öneri (örneğin bu konu ) /var/lib/dpkg/infodizine bakmaktır . Buradaki dosyalar şunun gibi bir şeyi deneyebileceğinizi önerir:

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

Seçimler hakkındaki sorunuza cevap vermek için işte ilk mesaj.

tarihlere göre paket listesi oluşturma

$ 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

kurulu paketlerin listesini oluşturma

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

2 listeye katıl

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

Bazı nedenlerden dolayı benim için çok fazla bir fark yok, bu nedenle ne --get-selectionsanlama geldiğiyle ilgili bir hata veya geçersiz bir varsayım olabilir .

Açıkçası kullanarak ya paketlerini sınırlayabilir find . -mtime -<days>ya head -n <lines>, mesela, ve istediğiniz gibi çıktı biçimini değiştirmek

$ 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

sadece son 4 günde kurulan (değiştirilen?) seçimleri listelemek için.

Muhtemelen, sortkullanılan sıralama düzenini doğruladıktan sonra komutları kaldırabilir dpkg --get-selectionsve findkomutu daha verimli hale getirebilirsiniz .


8
Genellikle apt-getdaha fazlasını severim rpm, ancak şimdi debian kurulum tarihini veri tabanına kaydetmediği için -1 alır. Debian numarası, yalnızca seçilen paketleri değil, yüklü tüm paketleri içerir , ancak bu iyi bir başlangıçtır.
Elazar Leibovich

Debian için eğer daha az hamle elde edersiniz ( half-installedgirişleri kaldırırsınız ):grep install\ /var/log/dpkg.log
Pierz

@Mikel - Harika cevap. 'Toplama /var/lib/dpkg/info/*.list dosya bilgisi' üzerinde genişledim ve "üst düzey paketleri" (diğer atp paketlerinin dayanmadığı atp paketleri) dışında tümünü filtrelemek için kod ekledim. < Askubuntu.com/a/948532/723997 > post , "Elle çalıştırdığım apt-get install komutlarının geçmişini nasıl görebilirim?" Sorusuna yanıt verir .
Craig Hicks,

1
Debian / Ubuntu: grep " install " /var/log/dpkg.log“durum” satırlarını göstermek yerine sadece “kur” satırlarını listeler.
tatlı

Ne zaman apt ne de dpkg mağazası tarih / saat değiştirmediyse, 2019'da bu benim için kabul edilemez görünüyor. Halen makinede olabilecek veya olmayacak olan grepping log dosyalarına güveniyoruz? Bu nasıl?
theferrit32

20

Mikel bunun dpkg seviyesinde nasıl yapıldığını göstermiştir . Özellikle, /var/lib/dpkg/info/$packagename.listpaket yüklendiğinde oluşturulur (ve daha sonra değiştirilmez).

APT araçlarını kullandıysanız (muhtemelen otomatik olarak el ile yüklü paketler konusunda endişelendiğinizden beri yaptığınız gibi), içinde bir geçmiş vardır /var/log/apt/history.log. Dönmediği sürece, otomatik olarak kurulmuş olarak işaretlenmiş paketler için bir ek açıklama ile tüm APT kurulumlarını, yükseltmelerini ve kaldırılmasını izler. Bu, APT 0.7.26'da tanıtılan oldukça yeni bir özelliktir, bu yüzden Debian'da sıkıştı. Ubuntu'da, 10.04'te history.logotomatik olarak yüklenmiş ek açıklama 10.10'a kadar mevcut değildir.


1
Mikel'in belirttiği gibi: "Ve nihayetinde eski /var/log/dpkg.log.* dosyaları log döndürülerek silinecek, bu şekilde sisteminizin bütün tarihini size bildirmeniz garanti edilmeyecektir.". Şu anki en üst düzey paketleri nasıl tespit edeceğinize ilişkin < askubuntu.com/a/948532/723997 > cevabına bakın (başka hiçbir paketin bağlı olmadığı paketler anlamına gelir)
Craig Hicks

5

Pürüzlü, ama işe yarıyor:

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

2
Boo, çıktıyı ayrıştırmak için tısla ls. Bunun neden tehlikeli / doğası gereği buggy olduğu konusunda notlar için mywiki.wooledge.org/ParsingLs'e bakın - daha güvenli seçenek ya kullanmak ya find -printfda stat --formataçıkça ayrıştırılabilecek bir akış oluşturmaktır.
Charles Duffy

@CharlesDuffy Güzel bağlantı, ancak basitlik amacıyla, ls -al --time-style=long-isokullanımı yararlı olmalıdır. Ek olarak, muhtemelen birisinin kendi adında bir APT paketini adlandıracağı da duyulmamıştır \n\t\r\v.
not2qubit

4

/var/log/apt/history.logDosya bir garip biçim IMHO vardır.

Başlangıç ​​Tarihi: {date} {time} Komut Satırı: {command} {options ...} Yükle: {package (version)}, ..., {package (version)}, ... Bitiş Tarihi: {date } {time}

Daha fazla günlük dosyası formatlı bir kayıt tercih ederdim

{Date} {time} {tab} {paket} {tab} {version} {tab} {komut} {seçenekleri} \ n

veya yalnızca bir {paket} değil, herhangi bir {bağımlılık} da gösteren bir XML.

Halen uygulanmakta olduğu gibi, aradığınız bilgileri keşfedebilirsiniz, ancak ayrıntıları çıkarmak için bazı adli işlemler gerektirir.


3

Bu benim için bir Debian sisteminde işe yarıyor, dosya biçiminin 2011'den bu yana değiştiğini tahmin ediyorum. Bu sistem oldukça taze, bu nedenle eski bir sistemde çalışmasını beklemiyorum, ancak günlükleri açmayı ve kullanmayı gerektirebilir hepsine atıfta bulunmak için bir glob.

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

Dosyanın her satırındaki ilk iki alan /var/log/dpkg.logtarih ve saattir. Grep bölümünde yükleme olan sondaki boşluğa dikkat edin, bunun nedeni yükseltme işlemlerinin yüklemeleri tetikleyebilmesidir, ancak doğru bir şekilde anladıysam kullanıcılar tarafından nelerin yüklendiğini bilmek istediniz.


1
Tam olarak ne yapıyorum. Kolay. Fakat zgrep'i kullanabilirsiniz ve tüm .gz günlükleriniz zgrep 'install' /var/log/dpkg.log* gibi aranacaktır. Bu "yarım yükleme" sinir bozucu önlemek için "yükleme" sözcüğü önce alanı yerleştirin. Paket adı alanını almak için cut -f1,5 kullanmak zorunda kaldım. Elbette sonunda eski kütükler dışarı fırlar.
geoO

2

İşte herkesin istediği ve ihtiyaç duyduğu tek gömlek:

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

Sonuç, tüm yeni (yeni) kurulmuş ve yükseltilmiş paketleri kronolojik sırada gösterecektir .

Satır açıklaması:

  • ls -1t- tüm dpkg.log*dosya adlarını kronolojik sıraya göre alın
  • zcat -f- EĞER dosya gzip türünde ise daha sonra sıkıştırmayı açar , ELSE sadece içeriği iletir .
  • tac- Kedinin ters çıktısını , satır sıra satır doğru kronolojik sıraya almamızı sağlar.
  • grep- Sadece kurulu veya yükseltme paketlerini kontrol edin .
  • awk -F ':a'- Mimari alanını paket adından ayırın
  • column -t - boşlukla ayrılmış sütunları yazdır

Biri elbette bunun için bir takma isim yapmak ister, ama ne yazık ki awk hem tekli hem de çiftli tırnaklara bağlı olduğundan mümkün değildir . Bu bakımdan, bu en iyi bash betiğine yerleştirilir ve :ayırıcının alan sütunundaki diğer mimariler için daha iyi kullanıldığı yerlerdir .

Çıktı:

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

dezavantajı:

  • Yukarıda gösterildiği gibi, yalnızca ARM mimarisinde çalışır ve mimari alan ayırıcısı için hafif bir değişiklik yapılması gerekir
  • Kolay takma ad için bir komut dosyasına girmeniz gerekir
  • Diğer * nix sistemlerinde test edilmemiştir

1

Bunu not ettiğiniz için diğer dağıtım cevaplarının açık olduğunu belirttiğinizden. rpm, biri INSTALLTIME olan büyük bir çıktı biçimi etiketine sahiptir. ( wgetÖrnek olarak kullanmak )

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

Bu birkaç şekilde biçimlendirilebilir. Bu şekilde kullanıyorum:

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

Bu iki sayfa, RPM meta veri sorunlarını çözme konusunda bir sürü harika bilgiye sahiptir:

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

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

Bu bilgilerin sıralanması, sorununuz için size çalışan bir çözüm sağlayacaktır.


1

GNU / Linux Debian'ın bu problem için yerleşik bir aracı yoktur, ancak standart şekilde yüklenen programlar hakkında tüm bilgiler , / var / lib / dpkg / info / konumundaki program-name.list dosyalarına kaydedilir . Ancak orada el ile yüklü programlar hakkında bilgi yok.


Uzun tek hatlı bir çözüm :

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

Açıklama :

  1. ls -rtÇıktıların tarihe göre sıralanmasına göre, yani listenin sonundaki en yeni dosyalara göre sıralanmış dosyaları çıkarır.
  2. stat Dosyanın tarihini okunabilir biçimde yazdırır.
  3. printf paket adını ve son değişiklik tarihini gösterir.
  4. forEn eski yenisine doğru bir bütün baskılar paket isimleri ve tarihleri gibi döngü.

Çıktı örneği (kesilmiş):

.........................................
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

Bu çözümün asıl kusuru üretimde iyi bir şekilde test edilmemiş olmasıdır.


Bu, işi neredeyse tamamlayan güzel bir çözüm. Tek dezavantajı var: (1) çok yavaş ve (2) bir paketin en son ne zaman güncellendiğini , önceki sürümlerinden hiçbirini göstermediğini gösteriyor . Bu, elbette tek gömlekle ilgili bir sorun değil, dpkg'ın tarihin izini sürmemesi /var/lib/dpkg/info/. Bu yüzden /var/log/dpkg.log*kullanımı tercih edilebilir.
not2qubit

1

Zor, ama diğer çözümler kadar çabuk çalışıyor. Tarih formatı yyyymmddhhmmss, yani bit veya yeniden sıralama ve format kaldırma işlemi, sıralanabilecek bir sayıya yol açar.

Diğer çözümler sayesinde birçoğu, bu liste, kopya işletim sistemi yapmak için bir yapıda kullanılabilecek kurulum sırasına göre paketler.

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-mağaraya hoş geldiniz! Lütfen insanların ne tür bir çıktı bekleyeceğini görebilmesi için birkaç satırlık çıktı ekleyin .
not2qubit 5:18
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.