ইনস্টলেশনের তারিখ অনুসারে একটি উপযুক্ত ভিত্তিক সিস্টেমে প্যাকেজগুলি তালিকাভুক্ত করুন


104

আমি ইনস্টলেশন তারিখ অনুসারে ইনস্টল করা প্যাকেজগুলি কীভাবে তালিকাভুক্ত করতে পারি?

আমার এটি ডেবিয়ান / উবুন্টুতে করা দরকার। অন্যান্য বিতরণের উত্তরগুলিও ভাল লাগবে।

একটি নির্দিষ্ট টুকরো কোডটি সংকলন করার জন্য আমি প্রচুর স্টাফ ইনস্টল করেছি এবং আমি যে প্যাকেজগুলি ইনস্টল করতে হয়েছিল তার একটি তালিকা পেতে চাই।



1
আমি কোনও ভাগ্য ছাড়াই "অ্যাপল রিলিজ ডেট" এর জন্য গুগল করছি, সম্ভবত এই মন্তব্যটি ভবিষ্যতের গুগলদের সহায়তা করবে।
থারস্মমনার

উত্তর:


66

রেড হ্যাট এর মতো আরপিএম ভিত্তিক বিতরণগুলি সহজ:

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

নির্বাচন সম্পর্কে আপনার প্রশ্নের উত্তর দিতে, এখানে প্রথম পাস's

তারিখ অনুসারে প্যাকেজগুলির তালিকা তৈরি করুন

$ 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
পিয়ার্জ

@ মাইকেল - দুর্দান্ত উত্তর আমি 'সংগ্রহ /var/lib/dpkg/info/*.list ফাইল তথ্য' এবং "শীর্ষ স্তরের প্যাকেজ" ব্যতীত সমস্ত ফিল্টার আউট কোড যুক্ত করতে কোড যুক্ত করেছি (এটিপ প্যাকেজ যার উপর নির্ভর করে অন্য কোনও এটিপ প্যাকেজ নির্ভর করে না)। সেই < Askubuntu.com/a/948532/723997 > পোস্টের প্রশ্নের উত্তর "আমি নিজেই সম্পাদিত কমান্ডগুলির অ্যাপ্লিকেশন -প্রাপ্ত ইনস্টলের ইতিহাস কীভাবে দেখতে পারি? "।
ক্রেগ হিক্স

1
ডেবিয়ান / উবুন্টু: grep " install " /var/log/dpkg.log"স্থিতি "গুলি দেখানোর পরিবর্তে কেবলমাত্র" ইনস্টল "লাইনগুলি তালিকাভুক্ত করে।
মিষ্টি

যদি অ্যাপটি বা ডিপি কেজি স্টোর দুটিই ইনস্টল / পরিবর্তিত তারিখের সময় না হয় তবে এটি আমার কাছে 2019 সালে বেশ অগ্রহণযোগ্য বলে মনে হচ্ছে We এটা কেস কেস?
theferrit32

20

মাইকেল দেখিয়েছেন কীভাবে এটি dpkg পর্যায়ে করবেন । বিশেষত, /var/lib/dpkg/info/$packagename.listতৈরি হয় যখন প্যাকেজ ইনস্টল করা হয় (এবং পরে পরিবর্তিত হয় না)।

আপনি যদি এপিটি সরঞ্জামগুলি ব্যবহার করেন (যা সম্ভবত আপনি নিজে থেকেই ইনস্টল করা প্যাকেজগুলি বনাম সম্পর্কে উদ্বিগ্ন হয়ে পড়েছেন) তবে এর ইতিহাস রয়েছে /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
বো, থেকে আউটপুট পার্সিংয়ের জন্য হিসস ls। এটি কেন বিপজ্জনক / সহজাত বগী সে বিষয়ে নোটগুলির জন্য mywiki.wooledge.org/ পার্সিংএলগুলি দেখুন - নিরাপদ বিকল্পটি হয় হয় হয় ব্যবহার করা find -printfবা stat --formatনির্বিঘ্নভাবে পার্স করা যায় এমন একটি স্ট্রিম তৈরি করা।
চার্লস ডাফি

@ চার্লসডুফি চমৎকার লিঙ্ক, তবে সরলতার উদ্দেশ্যে, ব্যবহার ls -al --time-style=long-isoকরা সহায়ক হওয়া উচিত। তদ্ব্যতীত, এটি সম্ভবত শোনা যায় নি যে কেউ তার নামের সাথে একটি এপিটি প্যাকেজটির নাম রাখবে \n\t\r\v
not2qubit

4

/var/log/apt/history.logফাইল একটি বিশ্রী বিন্যাস প্রোগ্রামটিতে ইতিমধ্যেই রয়েছে।

শুরুর তারিখ: {তারিখ {সময়} কমান্ডলাইন: {কমান্ড} {বিকল্পসমূহ ...} ইনস্টল করুন: {প্যাকেজ (সংস্করণ)}, ..., {প্যাকেজ (সংস্করণ)}, ... সমাপ্তির তারিখ: {তারিখ {{সময়

আমি আরও লগ-ফাইল ফর্ম্যাট রেকর্ড পছন্দ করতাম

{তারিখ} {সময়} {ট্যাব} {প্যাকেজ} {ট্যাব} {সংস্করণ} {ট্যাব} {কমান্ড} {অপশন} \ N

বা কিছু এক্সএমএল কেবল একটি {প্যাকেজ} নয় তবে কোনও {নির্ভরতা} দেখায়}

বর্তমানে কার্যকর হিসাবে, আপনি যে তথ্য সন্ধান করছেন তা আবিষ্কার করতে পারেন তবে বিশদটি বের করার জন্য এটি কিছু ফোরেনসিক প্রক্রিয়াজাতকরণ প্রয়োজন।


3

এটি আমার জন্য একটি ডেবিয়ান সিস্টেমে কাজ করে, আমি অনুমান করছি যে ফাইলে ফর্ম্যাটটি ২০১১ সাল থেকে পরিবর্তিত হয়েছে This তাদের সব উল্লেখ করার জন্য একটি গ্লোব।

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

ফাইলের প্রতিটি লাইনের প্রথম দুটি ক্ষেত্র হ'ল /var/log/dpkg.logতারিখ এবং সময়। গ্রেপ অংশে ইনস্টলের সাথে পিছনের স্থানটি নোট করুন, এটি কারণ আপগ্রেডগুলি ইনস্টলগুলি ট্রিগার করতে পারে তবে আমি যদি সঠিকভাবে বুঝতে পারি তবে আপনি কি ব্যবহারকারীদের দ্বারা ইনস্টল করা হয়েছে তা জানতে চেয়েছিলেন।


1
ঠিক আমি কি করি। সহজ। তবে আপনি zgrep ব্যবহার করতে পারেন এবং আপনার সমস্ত .gz লগ zgrep 'ইনস্টল' /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- যদি ফাইলটি জিজিপ টাইপের হয় তবে এটি সংক্ষেপিত করুন, সংক্ষেপিত করুন ELSE কেবলমাত্র সামগ্রীটিতে পাস করুন।
  • tac- বিড়ালের বিপরীত আউটপুট , লাইন বাই লাইন নিশ্চিত করে যাতে আমরা সঠিক কালানুক্রমিক ক্রম পেয়েছি।
  • grep- কেবল ইনস্টলড বা প্যাকেজগুলি আপগ্রেড করার জন্য পরীক্ষা করুন ।
  • awk -F ':a'- প্যাকেজের নাম থেকে আর্কিটেকচার ক্ষেত্রটি পৃথক করুন
  • column -t - স্থান দ্বারা পৃথক কলামগুলি প্রিন্ট করুন

একটি অবশ্যই অবশ্যই এর জন্য একটি উপনাম তৈরি করতে চাইবে, তবে দুর্ভাগ্যক্রমে এটি সম্ভব নয় কারণ একা এবং ডাবল উভয় উক্তির উপর বিশ্রী নির্ভর করে। সে ক্ষেত্রে এটি সেরাভাবে ব্যাশ স্ক্রিপ্টে রাখা হয়েছে এবং যেখানে ক্ষেত্রের কলামের :অন্যান্য আর্কিটেকচারের জন্য বিভাজককে আরও ভালভাবে পরিচালনা করা হবে ।

আউটপুটটি হ'ল:

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

এটি উল্লেখ করা কারণ আপনি উল্লেখ করেছেন যে অন্যান্য বিতরণ উত্তরগুলি স্বাগত। আরপিএম-এ বড় আকারের আউটপুট ফর্ম্যাট ট্যাগ রয়েছে, যার মধ্যে একটি ইনস্টললটাইম। ( 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

এই দুটি পৃষ্ঠায় আরপিএম মেটাডেটা সমস্যাগুলি সমাধান করার জন্য প্রচুর পরিমাণে তথ্য রয়েছে:

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

এই সলিউশনটির মূল ত্রুটি is এটি উত্পাদনে ভাল পরীক্ষিত নয়।


এটি একটি সুন্দর সমাধান যা কাজটি প্রায় শেষ করে দেয়। এটি কেবল ত্রুটিগুলি, এটি কি (1) এটি খুব ধীর এবং (2) এটি কেবল তখনই প্রদর্শিত হয় যখন কোনও প্যাকেজ শেষবার আপডেট হয়েছিল , এর পূর্ববর্তী সংস্করণগুলির কোনও নয়। এটি অবশ্যই ওয়ান-লাইনারের সমস্যা নয়, তবে কীভাবে dpkg ইতিহাসের ট্র্যাক রাখে না /var/lib/dpkg/info/। এজন্যই ব্যবহারকে /var/log/dpkg.log*পছন্দ করা যেতে পারে।
not2qubit

1

এটি মোটামুটি, তবে অন্যান্য সমাধানের মতো দ্রুত কাজ করে। তারিখের ফর্ম্যাটটি হ'ল yyymmddhhmmss, এর অর্থ একটি বিট বা পুনরায় অর্ডারিং এবং ফর্ম্যাট অপসারণের ফলে একটি সংখ্যা বাছাই করা যায়।

অন্যান্য সমাধানগুলির জন্য অনেক ধন্যবাদ, এই তালিকার প্যাকেজগুলির নাম ইনস্টলেশনগুলির ক্রম হিসাবে যা অনুলিপি অপারেটিং সিস্টেম তৈরি করতে একটি বিল্টে ব্যবহার করা যেতে পারে।

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.