Jak mohu zobrazit seznam nainstalovaných balíků podle data instalace?
Musím to udělat na debian / ubuntu. Pěkné by byly i odpovědi na jiné distribuce.
Nainstaloval jsem spoustu věcí, abych zkompiloval určitý kus kódu, a chci získat seznam balíčků, které jsem musel nainstalovat.
Komentáře
- Viz také Jak získat historii instalace apt-get .
- Hledal jsem “ apt datum vydání “ bez štěstí, možná tento komentář pomůže budoucím googlerům.
- Podobné otázky na askubuntu.com “ Jak zobrazit seznam všech nainstalovaných balíků “ .
Odpověď
Distribuce založené na RPM, jako je Red Hat, jsou snadné:
rpm -qa --last
V Debianu a dalších distribucích založených na dpkg je také váš konkrétní problém snadný:
grep install /var/log/dpkg.log
Pokud nebyl soubor protokolu otočen, měli byste to zkusit:
grep install /var/log/dpkg.log /var/log/dpkg.log.1
Obecně se zdá, že dpkg
a apt
nesledují datum instalace, což je způsobeno nedostatkem takového pole v dpkg-query
manuálová stránka.
A nakonec budou staré /var/log/dpkg.log.*
soubory smazány rotací protokolu, takže to tak není “ zaručeně vám neposkytne celou historii vašeho systému.
Jeden návrh, který se objeví několikrát (např toto vlákno ) je podívat se do adresáře /var/lib/dpkg/info
. Soubory tam naznačují, že byste mohli zkusit něco jako:
ls -t /var/lib/dpkg/info/*.list | sed -e "s/\.list$//" | head -n 50
Chcete-li odpovědět na svou otázku ohledně výběru, zde je první průchod.
sestavit seznam balíčků podle data
$ 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
sestavit seznam nainstalovaných balíčků
$ dpkg --get-selections | sed -ne "/\tinstall$/{s/[[:space:]].*//;p}" | \ sort > ~/dpkglist.selections
připojit se ke dvěma seznamům
$ join -1 1 -2 1 -t $"\t" ~/dpkglist.selections ~/dpkglist.dates \ > ~/dpkglist.selectiondates
Z nějakého důvodu to “ netiskne pro mě příliš mnoho rozdílů, takže může existovat chyba nebo neplatný předpoklad o tom, co --get-selections
znamená.
Balíky můžete samozřejmě omezit buď pomocí find . -mtime -<days>
nebo head -n <lines>
a změňte výstupní formát, jak chcete, např.
$ 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
zobrazí seznam pouze výběrů, které byly nainstalovány (změněny?) za poslední 4 dny.
Pravděpodobně můžete také odebrat příkazy sort
po ověření pořadí řazení používaného dpkg --get-selections
a vytvořením find
efektivnější.
Komentáře
- Obvykle se mi
apt-get
líbí více nežrpm
, ale nyní debian dostane -1 za to, že neuložil datum instalace do databáze. Trik debian zahrnuje všechny nainstalované balíčky, nejen vybrané balíčky, ale je to ‚ dobrý začátek. - Pro Debian máte získejte méně času (odstraní
half-installed
položky), pokud to uděláte:grep install\ /var/log/dpkg.log
- @Mikel – skvělá odpověď. Rozbalil jsem ‚ shromáždit informace o souboru /var/lib/dpkg/info/*.list ‚ a přidal kód k odfiltrování všech ale “ balíčky nejvyšší úrovně “ (balíčky atp, na kterých nejsou závislé žádné další balíčky atp). Tento < askubuntu.com/a/948532/723997> příspěvek odpovídá na otázku “ Jak mohu zobrazit historii instalačních příkazů apt-get, které jsem provedl ručně? „.
- Debian / Ubuntu:
grep " install " /var/log/dpkg.log
vypisuje pouze řádky „instalace“, místo aby zobrazoval i ty „stavové“. - Pokud ani apt, ani dpkg neukládají instalovaný / upravený datetime, zdá se mi to v roce 2019 docela nepřijatelné. Spoléhali jsme se na grepování logovacích souborů, které na stroji mohou nebo nemusí být? Jak je to v tomto případě?
Odpověď
Mikel ukázal, jak to udělat na úrovni dpkg . Zejména /var/lib/dpkg/info/$packagename.list
se vytvoří, když je balíček nainstalován (a následně upraven).
Pokud jste použili nástroje APT (což jste pravděpodobně udělali, protože jste „) obáváte se automaticky vs ručně instalovaných balíků), v /var/log/apt/history.log
je historie. Dokud se neotočí, sleduje všechny instalace, upgrady a odebrání APT s anotací pro balíčky označené jako automaticky nainstalované. Toto je poměrně nová funkce, zavedená v APT 0.7.26, takže v Debianu se objevil v squeeze. V Ubuntu 10.04 má history.log
, ale automaticky nainstalovaná anotace je k dispozici až 10.10.
Komentáře
- Jako Mikel poukázal na: “ A nakonec budou staré soubory /var/log/dpkg.log.* smazány rotací protokolů, takže tak nebude ‚ zaručeně vám poskytne celou historii vašeho systému. „. Viz toto < askubuntu.com/a/948532/723997 > odpověď na to, jak detekovat aktuální balíčky nejvyšší úrovně (tj. ty, na kterých žádný jiný balíček závisí)
odpověď
Drsný, ale funguje:
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
Komentáře
- Boo, syčení při analýze výstupu z
ls
. Viz mywiki.wooledge.org/ParsingLs , kde najdete poznámky, proč je to nebezpečné / neodmyslitelně chybné – bezpečnější možností je použít buďfind -printf
nebostat --format
k vygenerování streamu, který lze jednoznačně analyzovat. - @CharlesDuffy Pěkný odkaz, ale pro zjednodušení použití
ls -al --time-style=long-iso
by mělo být užitečné. Kromě toho je pravděpodobně neslýchané, že by někdo pojmenoval balíček APT se jménem\n\t\r\v
.
Odpovědět
Tady je jedna linka, kterou každý chce a potřebuje:
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
Výsledek zobrazí všechny (nově) nainstalované a upgradované balíčky v chronologickém pořadí.
Vysvětlení řádku:
-
ls -1t
– získejte všechnydpkg.log*
názvy souborů v chronologickém pořadí -
zcat -f
– KDYŽ je soubor gzip , pak jej dekomprimujte, JINÉ stačí předat obsah. -
tac
– Zpětný výstup kočky , řádek po řádku, abychom zajistili správné chronologické pořadí. -
grep
– Zkontrolujte pouze nainstalované nebo upgradovat balíčky. -
awk -F ":a"
– oddělit pole architektura od názvu balíčku -
column -t
– pěkně vytisknout sloupce oddělené mezerou
Dalo by se samozřejmě udělat alias, ale bohužel to není možné, protože awk závisí na jednoduchém i uvozovky. V tomto ohledu je to nejlepší dát do bash skriptu a kde je :
oddělovač lépe zpracován pro ostatní architektury ve sloupci pole.
Výstup je:
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
Nevýhoda:
- Jak je uvedeno výše, funguje pouze na architektuře ARM a vyžaduje malou úpravu pro oddělovač polí architektury.
- Je třeba vložit skript pro snadný alias
- Nebyl testován na jiných systémech * nix
Odpověď
Soubor /var/log/apt/history.log
má nepříjemný formát IMHO.
Počáteční datum: {date} {čas } Příkazový řádek: {command} {options …} Install: {package (version)}, …, {package (version)}, … End-Date: {date} {time}
Chtěl bych upřednostnit záznam ve více formátu souboru protokolu
{date} {time} {tab} {package} {tab} {version} {tab} {command} {options} \ n
nebo nějaký XML zobrazující nejen { package} but any {dependencies}.
Jak je aktuálně implementováno, můžete c objevte informace, které hledáte, ale k získání podrobností je nutné určité forenzní zpracování.
Odpověď
Toto funguje pro mě na Systém Debian, hádám, že se formát souboru změnil od roku 2011. Tento systém je docela nový, takže bych neočekával, že by to fungovalo na starším systému, i když to může vyžadovat pouze rozbalení protokolů a použití globu k označení všech z nich.
grep "install " /var/log/dpkg.log.1 | sort | cut -f1,2,4 -d" "
První dvě pole v každém řádku souboru /var/log/dpkg.log
jsou datum a čas. Všimněte si koncového prostoru s instalací v grep části, je to proto, že upgrady mohou spouštět instalace, ale pokud jsem správně pochopil, chtěli byste vědět, co si uživatelé nainstalovali.
Komentáře
- Přesně to, co dělám. Snadný. Můžete ale použít zgrep a všechny vaše protokoly .gz budou prohledány jako zgrep ‚ install ‚ /var/log/dpkg.log *.Umístěte mezeru před slovo “ install „, abyste zabránili těmto otravným “ polovičním instalacím „. Musel jsem použít cut -f1,5, abych získal pole názvu balíčku. Samozřejmě se nakonec staré protokoly otočí.
Odpověď
GNU / Linux Debian nemá žádné vestavěné nástroje pro tento problém, ale všechny informace o programech nainstalovaných standardním způsobem se ukládají do souborů s název-programu. seznam v umístění / var / lib / dpkg / info / . Neexistují však žádné informace o ručně nainstalovaných programech.
Dlouhé jednořádkové řešení :
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
Vysvětlení :
-
ls -rt
vypíše soubory seřazené podle změna data v opačném pořadí, tj. s nejnovějšími soubory na konci seznamu. -
stat
vytiskne soubor datum v podobě čitelné pro člověka. -
printf
zobrazí název balíčku a datum jeho poslední úpravy. -
for
smyčka jako celek vytiskne názvy balíčků a data od nejstarších po nejnovější.
Příklad výstupu (zkrácen):
......................................... 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
Hlavní vadou tohoto řešení je, že to není dobře otestováno v produktu ion.
Komentáře
- Toto je krásné řešení, díky kterému je práce téměř hotová. Má ‚ pouze nevýhody, je to (1) je ‚ velmi pomalý a (2) zobrazuje se pouze tehdy, když balíček byl naposledy aktualizován , žádná z jeho ‚ předchozích verzí. To samozřejmě není problém jednorázové linky, ale jak dpkg ‚ ne sleduje historii v
/var/lib/dpkg/info/
. I proto může být upřednostňováno použití/var/log/dpkg.log*
.
Odpověď
Beru na vědomí, protože zmiňujete, že další odpovědi na distribuci jsou vítány. rpm má velkou sadu značek výstupního formátu, z nichž jeden je INSTALLTIME. (Jako příklad používáme wget
)
rpm -qi wget --qf "%{NAME},%{INSTALLTIME}\n" | tail -n 1 wget,1454014156
Lze jej naformátovat několika způsoby. Používám to takto:
rpm -qi wget --qf "%{NAME},%{INSTALLTIME:date}\n" | tail -n 1 wget,Thu 28 Jan 2016 03:49:16 PM EST
Tyto dvě stránky obsahují spoustu skvělých informací o řešení problémů s metadaty RPM:
http://www.rpm.org/max-rpm/s1-rpm-query-parts.html
http://www.rpm.org/max-rpm/s1-rpm-query-handy-queries.html
Třídění těchto informací vám poskytne funkční řešení vašeho problému.
Odpovědět
Je to hrubé, ale funguje to stejně rychle jako jiná řešení. Formát data je rrrrmmddhhmmss, což znamená, že výsledkem bitů nebo přeskupení a formátování je číslo, které lze třídit.
Mnohokrát děkuji za další řešení, tento seznam jmen balíků v pořadí instalace, které lze použít v vytvořený operační systém pro kopírování.
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}"
Komentáře
- Vítejte @ alexander-cave! Přidejte několik řádků výstupu , aby lidé viděli, jaký druh výstupu lze očekávat.
Odpovědět
S rotovanými logfiles v apt můžete:
zcat -f /var/log/dpkg.log* | grep " install " | less
odpovědět
Dosáhl jsem toho na Kubuntu pomocí následujících příkazů:
- Seznam balíčků.
- přečtěte si každý standardní vstup.
- uložte celý cesta (cesta | datum vytvoření) ve formátu „% n |% y “ do proměnné.
- uložit název souboru do proměnné
- pokud byly oba předchozí příkazy provedeny úspěšně, hodnoty se vytisknou do jednoho řádku.
ls /var/lib/dpkg/info/*.list |while read xfile; do wpath=$(stat -c "%n|%y" ${xfile}) && wfile=$(basename ${xfile}) && printf "${wfile}|${wpath}\n" ;done
S pozdravem,