it-swarm-tr.com

Kurulum tarihine göre uygun bir sistemdeki paketleri listeleyin

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

Ben debian/ubuntu bunu yapmak gerekir. Diğer dağıtımların cevapları da iyi olurdu.

Belirli bir kod parçasını derlemek için çok fazla şey yükledim ve kurmak zorunda olduğum paketlerin bir listesini almak istiyorum.

106

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

rpm -qa --last

Debian ve diğer dpkg tabanlı dağıtımlarda, özel sorununuz da kolaydır:

grep install /var/log/dpkg.log

Günlük dosyası döndürülmedikçe şunu denemelisiniz:

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

Genel olarak, dpkg ve apt, dpkg-query Kılavuz sayfasında böyle bir alanın bulunmaması nedeniyle kurulum tarihini izlemiyor gibi görünüyor.

Ve sonunda eski /var/log/dpkg.log.* Dosyaları günlük rotasyonu ile silinecek, böylece size sisteminizin tüm geçmişini vereceği garanti edilmez.

Birkaç kez görünen bir öneri (örneğin bu kon ) /var/lib/dpkg/info Dizinine bakmaktır. Oradaki dosyalar aşağıdaki gibi bir şey denemenizi önerir:

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

Seçimlerle ilgili sorunuza cevap vermek için ilk geçiş.

tarihe 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 derleme listesi

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

2 listeye katılın

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

Bazı nedenlerden dolayı benim için çok fazla fark yazdırmıyor, bu nedenle --get-selections 'Un ne anlama geldiğine dair bir hata veya geçersiz bir varsayım olabilir.

Paketleri açıkça find . -mtime -<days> Veya head -n <lines> Kullanarak sınırlayabilir ve çıktı biçimini istediğiniz gibi değiştirebilirsiniz;.

$ 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

yalnızca son 4 gün içinde yüklenen (değiştirilen?) seçimleri listelemek için.

Ayrıca dpkg --get-selections Tarafından kullanılan sıralama düzenini doğruladıktan sonra sort komutlarını kaldırabilir ve find komutunu daha verimli hale getirebilirsiniz.

68
Mikel

Mikel bunu dpkg düzeyinde nasıl yapacağını gösterdi . Özellikle, /var/lib/dpkg/info/$packagename.list paket yüklendiğinde oluşturulur (ve daha sonra değiştirilmez).

APT araçlarını (muhtemelen otomatik olarak manuel olarak yüklenen paketlere karşı endişelendiğiniz için yaptığınız) kullandıysanız, /var/log/apt/history.log. Döndürülmediği sürece, tüm APT kurulumları, yükseltmeleri ve kaldırma işlemlerini, otomatik olarak yüklenen olarak işaretlenmiş paketler için bir ek açıklama ile takip eder. APT 0.7.26, bu yüzden Debian'da sıkıştırılmış görünüyordu. Ubuntu'da 10.04'te history.log ancak otomatik olarak eklenen ek açıklama 10.10'a kadar mevcut değil.

Kaba, ama çalışı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
6
Dulantha

/var/log/apt/history.log dosyasının garip bir biçimi IMHO var.

Başlangıç ​​Tarihi: {tarih} {saat} Komut Satırı: {komut} {seçenekler ...} Yükle: {paket (sürüm)}, ..., {paket (sürüm)}, ... Bitiş Tarihi: {tarih } {zaman}

Daha günlük dosyası biçimli bir kaydı tercih ederdim

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

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

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

4
Saint DanBert

Bu benim için bir Debian sistemi üzerinde çalışıyor, sanırım dosya biçimi 2011 yılından bu yana değişti. Bu sistem oldukça taze, bu yüzden bu sadece günlükleri unzip ve kullanarak gerektirebilir, ancak bu eski bir sistem üzerinde çalışmasını beklemem hepsine atıfta bulunmak için bir glob.

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

_ [_] Dosyasının her satırındaki ilk iki alan /var/log/dpkg.log tarih ve saattir. Grep bölümünde install ile sondaki boşluğa dikkat edin, bunun nedeni yükseltmelerin yüklemeleri tetikleyebilmesidir, ancak doğru anladıysam kullanıcılar tarafından neyin yüklendiğini bilmek istersiniz.

3
Amias

İşte herkesin istediği ve ihtiyaç duyduğu tek astar:

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) kurulu ve yükseltilmiş paketleri kronolojik olarak gösterir sipariş.

Satır açıklaması:

  • ls -1t - hepsini al dpkg.log* dosya adları kronolojik sırada
  • zcat -f - dosya gzip türündeyse sıkıştırmayı kaldırın, - BAŞKA sadece içeriği aktarın.
  • tac - Doğru kronolojik sıraya ulaştığımızdan emin olmak için kedi satır satır ters çıktı.
  • grep - Yalnızca yüklü veya yükseltme paketlerini kontrol edin .
  • awk -F ':a' - mimari alanını paket adından ayırın
  • column -t - sütunları boşlukla ayrılmış şekilde yazdır

Elbette bunun için bir takma ad yapmak ister, ancak awk hem tek hem de çift tırnaklara bağlı olduğu için maalesef mümkün değildir. Bu bağlamda, bu en iyi bir bash betiğine konur ve burada : ayırıcı alan sütunundaki diğer mimariler için daha iyi işlenir.

Çı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, sadece ARM mimari üzerinde çalışır ve mimari alan ayırıcısı için küçük değişiklikler gerektirir
  • Kolay takma ad için bir komut dosyasına konulması gerekir
  • Diğer * nix sistemlerinde test edilmemiştir
2
not2qubit

GNU/Linux Debian'ın bu sorun için yerleşik bir aracı yoktur, ancak standart yol 'da yüklü programlarla ilgili tüm bilgiler program-name.list dosyalarına kaydedilir. konumunda /var/lib/dpkg/info/. Ancak orada el ile yüklenmiş programlar hakkında bilgi yoktur.


zun bir tek satırlık çö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, tarih değişikliğine göre sıralanmış dosyaları ters sırayla sıralar, yani listenin sonundaki en yeni dosyalarla çıkarır.
  2. stat dosyanın tarihini insan tarafından okunabilir biçimde yazdırır.
  3. printf paket adını ve son değiştirilme tarihini görüntüler.
  4. for döngüsü bir bütün olarak paket adlarını ve tarihlerini en eskiden en yeniye doğru yazdırır.

Çı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 ana kusuru. Üretimde iyi test edilmediğidir.

1
PADYMKO

Pürüzlüdür, ancak diğer çözümler kadar hızlı çalışır. Tarih biçimi yyyymmddhhmmss şeklindedir, yani biraz veya yeniden sıralama ve biçim kaldırma, sıralanabilecek bir sayı ile sonuçlanır.

Diğer çözümler sayesinde, bu liste kurulum sırasına göre paket isimlerini kullanabilmek için inşa edilmiş bir kopya işletim sistemi.

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

Bunu not etmek çünkü diğer dağıtım cevaplarının memnuniyetle karşılandığını belirtiyorsunuz. rpm, biri INSTALLTIME olan çok sayıda çıktı biçimi etiketine sahiptir. (Örnek olarak wget kullanılması)

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 sayfada, BGBG meta veri sorunlarını çözme konusunda çok sayıda harika bilgi var:

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

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

Bu bilgileri sıralamak size sorununuz için çalışan bir çözüm sunar.

1
Jonathan Swift