स्थापना तिथि के आधार पर उपयुक्त सिस्टम पर संकुल सूची


104

मैं स्थापना तिथि तक स्थापित पैकेजों को कैसे सूचीबद्ध कर सकता हूं?

मुझे डेबियन / ubuntu पर ऐसा करने की आवश्यकता है। अन्य वितरणों के उत्तर भी अच्छे होंगे।

मैंने एक निश्चित कोड को संकलित करने के लिए बहुत सारे सामान स्थापित किए, और मैं उन पैकेजों की एक सूची प्राप्त करना चाहता हूं जिन्हें मुझे स्थापित करना था।



1
मैं बिना किसी भाग्य के "उपयुक्त रिलीज़ की तारीख" के लिए गुगली कर रहा था, शायद इस टिप्पणी से भविष्य के गुगलों को मदद मिलेगी।
थोरसुमोनर

जवाबों:


66

रेड हैट जैसे RPM- आधारित वितरण आसान हैं:

rpm -qa --last

डेबियन और अन्य 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.*फाइलें लॉग रोटेशन से हटा दी जाएंगी, इस तरह आपको अपने सिस्टम के पूरे इतिहास को देने की गारंटी नहीं है।

एक सुझाव जो कुछ समय में दिखाई देता है (जैसे यह धागा ) /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 दिनों में केवल उन चयनों को सूचीबद्ध करने के लिए जिन्हें (बदला हुआ) स्थापित किया गया था।

आप संभवतः sortउपयोग किए गए क्रम को सत्यापित करने के बाद भी कमांड हटा सकते हैं dpkg --get-selectionsऔर findकमांड को अधिक कुशल बना सकते हैं।


8
मुझे आमतौर पर apt-getअधिक पसंद है rpm, लेकिन अब डेबियन को डेटाबेस में इंस्टॉलेशन की तारीख को बचाने के लिए -1 मिलता है। डेबियन ट्रिक में सभी स्थापित पैकेज शामिल हैं, न केवल चयनित पैकेज, बल्कि यह एक अच्छी शुरुआत है।
एलाजार लीबोविच

डेबियन के लिए आपको कम क्रॉफ्ट ( half-installedप्रविष्टियों को हटाता है ) यदि आप यू करते हैं:grep install\ /var/log/dpkg.log
पियरज

@ मिकेल - शानदार जवाब। मैंने 'इकट्ठा /वर / लीब /dkgkg/info/*.list फ़ाइल जानकारी' पर विस्तार किया और सभी फ़िल्टर करने के लिए कोड जोड़ा, लेकिन "शीर्ष स्तर के पैकेज" (एटीपी पैकेज जिस पर कोई अन्य एटीपी पैकेज निर्भर नहीं करता है)। कि < askubuntu.com/a/948532/723997 > post इस सवाल का जवाब देता है कि "मैं apt-get इंस्टॉल कमांड्स का इतिहास कैसे देख सकता हूं जो मैंने मैन्युअल रूप से निष्पादित की हैं? "।
क्रेग हिक्स

1
डेबियन / उबंटू: grep " install " /var/log/dpkg.log"स्थिति" को भी दिखाने के बजाय केवल "इंस्टॉल" लाइनों को सूचीबद्ध करता है।
डेसर्ट

अगर न तो उपयुक्त और न ही dpkg स्टोर स्थापित / संशोधित डेटाइम, जो 2019 में मेरे लिए बहुत अस्वीकार्य लगता है। हम लॉग फ़ाइलों पर भरोसा कर रहे हैं जो मशीन पर अभी भी हो सकते हैं या नहीं? यह कैसा मामला है?
theferrit32

20

मिकेल ने दिखाया है कि यह dpkg स्तर पर कैसे किया जाता है । विशेष रूप से, /var/lib/dpkg/info/$packagename.listतब बनाया जाता है जब पैकेज स्थापित होता है (और बाद में संशोधित नहीं किया जाता है)।

यदि आपने APT टूल का उपयोग किया है (जो कि आपने निश्चित रूप से किया है क्योंकि आप स्वचालित रूप से बनाम मैन्युअल रूप से स्थापित पैकेजों के बारे में चिंतित हैं), तो इसमें एक इतिहास है /var/log/apt/history.log। जब तक इसे घुमाया नहीं जाता है, तब तक यह स्वचालित रूप से स्थापित किए गए संकुल के लिए एनोटेशन के साथ, सभी एपीटी इंस्टॉलेशन, अपग्रेड और रिमूवल का ट्रैक रखता है। यह एक हालिया विशेषता है, जिसे एपीटी 0.7.26 में पेश किया गया है, इसलिए डेबियन में यह निचोड़ में दिखाई दिया। उबंटू में, 10.04 है history.logलेकिन स्वचालित रूप से स्थापित एनोटेशन 10.10 तक मौजूद नहीं है।


1
जैसा कि मिकेल ने बताया: "और अंततः पुरानी /var/log/dpkg.log.* फाइलें लॉग रोटेशन से हटा दी जाएंगी, इसलिए इस तरह से आपको अपने सिस्टम का पूरा इतिहास बताने की गारंटी नहीं है।" इसे देखें < askubuntu.com/a/948532/723997 > वर्तमान शीर्ष स्तर पैकेज का पता लगाने के लिए उत्तर दें (जिसका अर्थ है कि कोई अन्य पैकेज निर्भर नहीं करता है)
क्रेग हिक्स

5

रफ, लेकिन काम करता है:

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
बू, से उत्पादन पार्सिंग के लिए उसका है lsMywiki.wooledge.org/ParsingLs नोटों के लिए देखें कि यह खतरनाक / स्वाभाविक रूप से छोटी गाड़ी क्यों है - सुरक्षित विकल्प find -printfया तो उपयोग करना है या stat --formatएक धारा उत्पन्न करना है जिसे स्पष्ट रूप से पार्स किया जा सकता है।
चार्ल्स डफी

@CharlesDuffy अच्छा लिंक, लेकिन सादगी के उद्देश्य के लिए, ls -al --time-style=long-isoमददगार होना चाहिए। इसके अलावा, यह शायद अनसुना है कि कोई \n\t\r\vअपने नाम के साथ एपीटी पैकेज का नाम देगा।
Not2qubit

4

/var/log/apt/history.logफ़ाइल एक अजीब प्रारूप IMHO है।

प्रारंभ-तिथि: {दिनांक} {समय} कमांडलाइन: {कमांड} {विकल्प ...} स्थापित करें: {पैकेज (संस्करण)}, ..., {पैकेज (संस्करण)}, ... समाप्ति तिथि: {दिनांक } {समय}

मैंने अधिक लॉग-फ़ाइल स्वरूपित रिकॉर्ड पसंद किया होगा

{Date} {समय} {} {टैब पैकेज} {} {टैब संस्करण} {} {टैब आदेश} {} विकल्पों \ N

या कुछ एक्सएमएल न केवल एक {पैकेज} बल्कि किसी भी {आश्रित} को दिखा रहा है।

जैसा कि वर्तमान में लागू किया गया है, आप जो जानकारी चाहते हैं उसकी खोज कर सकते हैं लेकिन विवरण निकालने के लिए कुछ फोरेंसिक प्रसंस्करण की आवश्यकता होती है।


3

यह मेरे लिए एक डेबियन सिस्टम पर काम करता है, मैं अनुमान लगा रहा हूं कि फ़ाइल प्रारूप 2011 के बाद से बदल गया है। यह प्रणाली बहुत ताज़ा है, इसलिए मैं एक पुराने सिस्टम पर काम करने की उम्मीद नहीं करूंगा, हालांकि इसके लिए लॉग्स का उपयोग करने और उपयोग करने की आवश्यकता हो सकती है उन सभी को संदर्भित करने के लिए एक ग्लोब।

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

फ़ाइल की प्रत्येक पंक्ति में पहले दो फ़ील्ड /var/log/dpkg.logदिनांक और समय हैं। Grep भाग में स्थापित के साथ अनुगामी स्थान पर ध्यान दें, इसका कारण यह है कि उन्नयन इंस्टॉल को ट्रिगर कर सकता है लेकिन अगर मैं सही ढंग से समझता हूं कि आप जानना चाहते थे कि उपयोगकर्ताओं द्वारा क्या स्थापित किया गया था।


1
वास्तव में मैं क्या करता हूं। आसान। लेकिन आप zgrep का उपयोग कर सकते हैं और अपने सभी .gz लॉग को zgrep 'install' /var/log/dpkg.log* की तरह खोजा जाएगा। उन "पेसि" को रोकने के लिए "इंस्टॉल" शब्द से पहले स्थान रखें। मुझे पैकेज नाम फ़ील्ड प्राप्त करने के लिए कट -f1,5 का उपयोग करना पड़ा। निश्चित रूप से अंततः पुराने लॉग आउट हो जाते हैं।
जियो

2

यहां एक-लाइनर है जिसे हर कोई चाहता है और उसकी जरूरत है:

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

परिणाम कालानुक्रमिक क्रम में सभी (नव) स्थापित और उन्नत पैकेज दिखाएगा ।

लाइन स्पष्टीकरण:

  • ls -1t- dpkg.log*कालानुक्रमिक क्रम में सभी फ़ाइल नाम प्राप्त करें
  • zcat -f- अगर फ़ाइल gzip प्रकार की है, तो इसे विघटित करें, ELSE सामग्री पर बस पास हो।
  • tac- बिल्ली का उलटा आउटपुट , लाइन-बाय-लाइन यह सुनिश्चित करने के लिए कि हमें सही कालानुक्रमिक आदेश मिलता है।
  • grep- केवल स्थापित या उन्नयन पैकेज के लिए जाँच करें ।
  • awk -F ':a'- पैकेज के नाम से आर्किटेक्चर क्षेत्र को अलग करें
  • column -t - अंतरिक्ष द्वारा अलग किए गए स्तंभों को सुंदर प्रिंट करें

बेशक इसके लिए एक उपनाम बनाना पसंद करेंगे, लेकिन दुर्भाग्य से यह संभव नहीं है क्योंकि awk सिंगल और डबल कोट्स दोनों पर निर्भर करता है। इस संबंध में इसे बैश स्क्रिप्ट में रखा जाता है और जहां :सेपरेटर को कॉलम में अन्य आर्किटेक्चर के लिए बेहतर तरीके से हैंडल किया जाता है ।

आउटपुट है:

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

दोष यह है:

  • जैसा कि ऊपर दिखाया गया है, यह केवल एआरएम वास्तुकला पर काम करता है और वास्तुकला क्षेत्र विभाजक के लिए मामूली संशोधन की आवश्यकता है
  • आसान उर्फ ​​के लिए एक स्क्रिप्ट में डालने की आवश्यकता है
  • अन्य * निक्स प्रणालियों में परीक्षण नहीं किया गया है

1

यह देखते हुए क्योंकि आप उल्लेख करते हैं कि अन्य वितरण उत्तर स्वागत योग्य हैं। rpm में आउटपुट स्वरूप टैग का एक बड़ा सेट है, जिसमें से एक 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

इन दो पृष्ठों में RPM मेटाडेटा समस्याओं को हल करने के बारे में एक बड़ी जानकारी है:

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

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

इस जानकारी को छाँटने से आपको अपने मुद्दे का हल मिल जाएगा।


1

जीएनयू / लिनक्स डेबियन इस समस्या के लिए कोई अंतर्निहित टूल है, लेकिन में स्थापित कार्यक्रमों के बारे में सभी जानकारी मानक तरीका के साथ फ़ाइलें में सहेजा गया है कार्यक्रम-name.list स्थान में / var / lib / dpkg / जानकारी /लेकिन वहाँ मैन्युअल रूप से स्थापित कार्यक्रमों के बारे में कोई जानकारी नहीं है।


एक लंबी एकल-पंक्ति समाधान :

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

स्पष्टीकरण :

  1. ls -rtआउटपुट फाइल को रिवर्स ऑर्डर में डेट मॉडिफिकेशन द्वारा क्रमबद्ध किया जाता है, यानी सूची के अंत में सबसे नई फाइलों के साथ।
  2. stat फ़ाइल की तारीख को मानव पठनीय रूप में प्रिंट करता है।
  3. printf पैकेज नाम और उसके अंतिम संशोधन की तारीख को प्रदर्शित करता है।
  4. 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

इस solution.is का मुख्य दोष यह है कि यह उत्पादन में अच्छी तरह से परीक्षण नहीं किया गया है।


यह एक सुंदर समाधान है जो काम लगभग पूरा कर लेता है। यह केवल कमियां हैं, यह है कि (1) यह बहुत धीमा है और (2) यह केवल यह दिखाता है कि जब पैकेज को अंतिम रूप से अपडेट किया गया था , न कि इसके पिछले संस्करणों में से कोई। यह, निश्चित रूप से वन-लाइनर की समस्या नहीं है, लेकिन कैसे dpkg इतिहास का ट्रैक नहीं रखता है /var/lib/dpkg/info/। यही कारण है कि उपयोग /var/log/dpkg.log*करना भी पसंद किया जा सकता है।
not2qubit

1

यह मोटा है, लेकिन अन्य समाधानों के रूप में जल्दी से काम करता है। दिनांक स्वरूप 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}'

आपका स्वागत है @ अलेक्जेंडर-गुफा! कृपया आउटपुट की कुछ पंक्तियाँ जोड़ें ताकि लोग यह देख सकें कि किस प्रकार के आउटपुट की अपेक्षा की जाए।
not2qubit
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.