Hogyan sorolhatom fel a telepített csomagokat telepítési dátum szerint?
Ezt meg kell tennem a debian / ubuntuban. A többi terjesztésre adott válasz is jó lenne.
Sok dolgot telepítettem egy bizonyos kód összeállításához, és szeretnék egy listát a telepítendő csomagokról.
Megjegyzések
- Lásd még: Az apt-get install előzményeinek lekérése .
- A ” apt kiadás dátumát ” gugliztam, nem volt szerencsém, talán ez a megjegyzés segít a jövőbeni googlereknek.
- Hasonló kérdés a askubuntu.com címen ” Az összes telepített csomag felsorolása ” .
Válasz
Az RPM-alapú terjesztések, például a Red Hat, egyszerűen:
rpm -qa --last
A Debian és más dpkg-alapú terjesztések esetén az Ön problémája is egyszerű:
grep install /var/log/dpkg.log
Hacsak a naplófájlt nem forgatták, akkor próbálkozzon:
grep install /var/log/dpkg.log /var/log/dpkg.log.1
Általában úgy tűnik, hogy a dpkg
és a apt
nem követi a telepítés dátumát, mivel ilyen mező hiányzik a dpkg-query
man oldal.
És végül a régi /var/log/dpkg.log.*
fájlokat naplóforgatással töröljük, így nem lesz ” garantáltan megadja a rendszer teljes történetét.
Egy javaslat, amely néhányszor megjelenik (pl ez a szál ) a /var/lib/dpkg/info
könyvtárat keresi. Az ott található fájlok azt javasolják, hogy próbálkozzon valami hasonlóval:
ls -t /var/lib/dpkg/info/*.list | sed -e "s/\.list$//" | head -n 50
A válaszokkal kapcsolatos kérdésének megválaszolásához itt az első lépés.
a csomagok listájának dátum szerinti összeállítása
$ 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
a telepített csomagok összeállítási listája
$ dpkg --get-selections | sed -ne "/\tinstall$/{s/[[:space:]].*//;p}" | \ sort > ~/dpkglist.selections
csatlakozzon a 2 listához
$ join -1 1 -2 1 -t $"\t" ~/dpkglist.selections ~/dpkglist.dates \ > ~/dpkglist.selectiondates
Valamiért ” s nem nagyon sok különbséget nyomtat ki számomra, ezért előfordulhat, hogy hibát vagy érvénytelen feltételezést jelentenek az --get-selections
jelentése.
Nyilvánvalóan korlátozhatja a csomagokat akár: find . -mtime -<days>
vagy head -n <lines>
használatával, és tetszés szerint változtassa meg a kimeneti formátumot, pl.
$ 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
csak az elmúlt 4 napban telepített (módosított?) választások felsorolásához.
Valószínűleg eltávolíthatja a sort
parancsokat is miután ellenőrizte a dpkg --get-selections
által használt rendezési sorrendet, és elkészítette a find
parancs hatékonyabb.
Megjegyzések
- Általában jobban szeretem a
apt-get
-t, mint arpm
, de most a debian -1-et kap, mert nem mentette el a telepítés dátumát az adatbázisban. A debian trükk az összes telepített csomagot magában foglalja, nem csak a kiválasztott csomagokat, de ‘ is jó kezdet. - A Debian számára kap kevesebb Cruft (eltávolítja a
half-installed
bejegyzéseket), ha u:grep install\ /var/log/dpkg.log
- @Mikel – Remek válasz. Kibővítettem a ‘ collect /var/lib/dpkg/info/*.list fájlinformációkat ‘, és kódot adtam az összes kiszűrésére de a ” legfelső szintű csomagok ” (atp csomagok, amelyektől nem függ más atp csomag). Ez a < askubuntu.com/a/948532/723997> bejegyzés megválaszolja a kérdést ” Hogyan tekinthetem meg az manuálisan végrehajtott apt-get install parancsok előzményeit? “.
- Debian / Ubuntu:
grep " install " /var/log/dpkg.log
csak az „install” sorokat sorolja fel, ahelyett, hogy az „status” sorokat is megjelenítené. - Ha sem az apt, sem a dpkg store telepítési / módosítási dátum ideje nem tűnik elfogadhatónak számomra 2019-ben. Bízunk a grepping naplófájlokban, amelyek esetleg még vannak a gépen? Hogy van ez?
Válasz
Mikel megmutatta, hogyan kell ezt csinálni dpkg szinten . Különösen a /var/lib/dpkg/info/$packagename.list
jön létre a csomag telepítésekor (és nem módosítják utólag).
Ha az APT eszközöket használta (amit feltehetően azóta is tett ” aggódnak az automatikusan vs manuálisan telepített csomagok miatt), a “div history = /var/log/apt/history.log
. Amíg nem forog el, nyomon követi az összes APT telepítést, frissítést és eltávolítást, az automatikusan telepítettként megjelölt csomagokhoz tartozó kommentárokkal. Ez egy meglehetősen friss szolgáltatás, amelyet az APT 0.7.26, tehát a Debian tartalmaz. Az Ubuntuban 10.A 04-nek history.log
van, de az automatikusan telepített kommentár csak 10.10-ig van jelen.
Megjegyzések
- Mint Mikel rámutatott: ” És a régi /var/log/dpkg.log.* fájlokat végül naplóforgatással töröljük, így nem lesz ‘ t garantálja a rendszer teljes előzményeinek átadását. “. Lásd ezt: < askubuntu.com/a/948532/723997 > válasz az aktuális legfelső szintű csomagok észlelésére (vagyis azokra, amelyektől nem függ más csomag)
Válasz
Durva, de működik:
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
megjegyzések
- Bú, hisztiz a kimenet elemzéséhez
ls
. A mywiki.wooledge.org/ParsingLs oldalon talál megjegyzéseket arról, hogy ez miért veszélyes / eredendően hibás – a biztonságosabb lehetőség a vagystat --format
egy olyan adatfolyam előállításához, amely egyértelműen elemezhető. - @CharlesDuffy Nice link, de az egyszerűség kedvéért a
ls -al --time-style=long-iso
hasznos lehet. Ezenkívül valószínűleg nem hallható, hogy valaki egy APT csomagot a\n\t\r\v
névvel nevezne meg.
Válasz
Itt van az egyvonalas vonal, amelyet mindenki szeretne és amire szüksége van:
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
Az eredmény az összes (újonnan) telepített és frissített csomag időrendi sorrendben jelenik meg.
A sor magyarázata:
-
ls -1t
– az összesdpkg.log*
fájlnév megszerzése időrendben -
zcat -f
– HA fájl gzip típusú, akkor bontsa ki, Az ELSE csak továbbadja a tartalmat. -
tac
– A cat fordított kimenete , soronként, hogy megbizonyosodjon arról, hogy a helyes időrendet kapjuk-e. -
grep
– Csak telepítve vagy upgrade csomagok. -
awk -F ":a"
– Válassza el az architektúra mezőt a csomag nevétől -
column -t
– szépen nyomtassa ki az oszlopokat szóközzel elválasztva
Ehhez természetesen álnevet szeretne készíteni, de sajnos ez nem lehetséges Az awk mind az egyedülálló, mind a kettős idézetek. Ebben a tekintetben ezt a legjobban egy bash szkriptbe lehet beilleszteni, és ahol a :
elválasztót jobban kezeljük a mező oszlop többi architektúrájához .
A kimenet:
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
Hátrány:
- Amint fentebb bemutattuk, csak ARM architektúrán működik, és az architektúra mezőelválasztóhoz szükséges némi módosítás.
- Be kell helyezni az egyszerű álnevek parancsfájlja
- Nem tesztelték más * nix rendszereken
Válasz
A /var/log/apt/history.log
fájl kényelmetlen formátumú IMHO.
Kezdő dátum: {date} {idő } Parancssor: {parancs} {opciók …} Telepítés: {csomag (verzió)}, …, {csomag (verzió)}, … Befejezés dátuma: {dátum} {idő}
Jobban szerettem volna egy naplófájl-formázottabb rekordot
{date} {time} {tab} {package} {tab} {version} {tab} {command} {options} \ n
vagy valamilyen XML, amely nemcsak egy { csomag}, de bármely {függőség}.
A jelenlegi megvalósításnak megfelelően c egy felfedezni a keresett információt, de a részletek kibontásához némi törvényszéki feldolgozást igényel.
Válasz
Ez nálam működik Debian rendszer, azt hiszem, hogy a fájlformátum 2011 óta megváltozott. Ez a rendszer meglehetősen friss, ezért nem várnám, hogy ez egy régebbi rendszeren működjön, bár ehhez csak a naplók kibontása és egy glob használata szükséges az összes hivatkozásához. közülük.
grep "install " /var/log/dpkg.log.1 | sort | cut -f1,2,4 -d" "
A /var/log/dpkg.log
fájl minden egyes sorának első két mezője a dátum és az idő. Vegye figyelembe, hogy a grep részben található a hely a telepítéssel, ez azért van, mert a frissítések kiválthatják a telepítéseket, de ha jól értettem, akkor tudni akarta, hogy mit telepítettek a felhasználók. megjegyzések “>
Válasz
A GNU / Linux Debian nem tartalmaz beépített eszközöket erre a problémára, de a szokásos módon telepített programok minden információját a programnév fájlokba menti. list a / var / lib / dpkg / info / helyen. De a manuálisan telepített programokról nincsenek információk.
Hosszú egysoros megoldás :
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
Magyarázat :
-
ls -rt
fájlokat ad ki rendezés szerint a dátum módosítása fordított sorrendben, ie a legújabb fájlokkal a lista végén. -
stat
kinyomtatja a fájlt dátum ember által olvasható formában. -
printf
megjeleníti a csomag nevét és utolsó módosításának dátumát. - A
for
ciklus egészében kinyomtatja a csomagneveket és dátumokat a legrégebbről a legújabbra.
Kimeneti példa (csonka):
......................................... 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
A megoldás fő hibája. hogy nem jól tesztelt termék ion.
Megjegyzések
- Ez egy gyönyörű megoldás, amely szinte elvégzi a munkát. ‘ csak hátrányai, hogy (1) nagyon lassan ‘ és (2) csak akkor jelenik meg, ha egy csomagot utoljára frissítettek , egyikük sem korábbi verzióit. Ez természetesen nem az egyvonalas probléma, hanem az, hogy a dpkg nem ‘ hogyan követi nyomon a
/var/lib/dpkg/info/
történelmet. Ezért is előnyösebb a/var/log/dpkg.log*
használata.
Válasz
Megjegyezve ezt, mert megemlíti, hogy más terjesztési válaszokat is szívesen fogadunk. Az rpm nagy kimeneti formátumú címkékkel rendelkezik, amelyek közül az egyik INSTALLTIME. (Például a wget
példát használja)
rpm -qi wget --qf "%{NAME},%{INSTALLTIME}\n" | tail -n 1 wget,1454014156
Ez többféleképpen is formázható. Így használom:
rpm -qi wget --qf "%{NAME},%{INSTALLTIME:date}\n" | tail -n 1 wget,Thu 28 Jan 2016 03:49:16 PM EST
Ez a két oldal rengeteg nagyszerű információval rendelkezik az RPM metaadatokkal kapcsolatos problémák megoldásáról:
http://www.rpm.org/max-rpm/s1-rpm-query-parts.html
http://www.rpm.org/max-rpm/s1-rpm-query-handy-queries.html
Az információk rendezése megfelelő megoldást kínál a problémájára.
Válasz
Durva, de ugyanolyan gyorsan működik, mint más megoldások. A dátum formátuma ééééhhhhmmmss, ami azt jelenti, hogy egy kicsit, vagy az átrendezés és a formátumeltávolítás eredményeként rendezhető számot eredményez.
A többi megoldásnak köszönhetően ez a csomag a telepítés sorrendjében nevezi el a egy másolásra kész operációs rendszer.
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}"
Megjegyzések
- Üdvözöljük @ alexander-barlang! Kérjük, adjon hozzá néhány sort output -ból, hogy az emberek láthassák, milyen kimenetre számítanak.
Válasz
Az apt forgatott naplófájljaival a következőket teheti:
zcat -f /var/log/dpkg.log* | grep " install " | less
válasz
A következő parancsokkal értem el a Kubuntun:
- Sorolja fel a csomagokat.
- olvassa el az összes szabványos bemenetet.
- tárolja a teljes elérési út (elérési út | létrehozott dátum) “% n |% y ” formátumban változóvá.
- tárolja a fájl nevét egy változóba
- ha mindkét korábbi parancs sikeresen végrehajtásra került, az értékeket egyetlen sorban nyomtatják ki.
ls /var/lib/dpkg/info/*.list |while read xfile; do wpath=$(stat -c "%n|%y" ${xfile}) && wfile=$(basename ${xfile}) && printf "${wfile}|${wpath}\n" ;done
Üdvözlettel: