আমি ম্যানুয়ালি ইনস্টল করা প্যাকেজগুলির একটি তালিকা পেতে চাই এবং apt
অথবা প্যাকেজটি ম্যানুয়ালি বা স্বয়ংক্রিয়ভাবে ইনস্টল হয়েছিল aptitude
কিনা তা জানতে সক্ষম হয়েছি foobar
। কমান্ড লাইন থেকে এটি করার কোন ঝরঝরে উপায় আছে?
আমি ম্যানুয়ালি ইনস্টল করা প্যাকেজগুলির একটি তালিকা পেতে চাই এবং apt
অথবা প্যাকেজটি ম্যানুয়ালি বা স্বয়ংক্রিয়ভাবে ইনস্টল হয়েছিল aptitude
কিনা তা জানতে সক্ষম হয়েছি foobar
। কমান্ড লাইন থেকে এটি করার কোন ঝরঝরে উপায় আছে?
উত্তর:
আপনি এই দুটি ওয়ান-লাইনারের কোনওটিই ব্যবহার করতে পারেন। উভয়ই আমার মেশিনে ঠিক একই আউটপুট দেয় এবং এই প্রশ্নের এখন পর্যন্ত (6 জুলাই, 2014) প্রস্তাবিত সমস্ত সমাধানের চেয়ে আরও সুনির্দিষ্ট।
ব্যবহার apt-mark
:
comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)
ব্যবহার aptitude
:
comm -23 <(aptitude search '~i !~M' -F '%p' | sed "s/ *$//" | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)
খুব কম প্যাকেজগুলি এখনও ফাটলগুলির মধ্যে পড়ে, যদিও আমি সন্দেহ করি যে এটি প্রকৃতপক্ষে ভাষা দ্বারা স্থানীয়করণ সেটআপের মাধ্যমে বা উদাহরণস্বরূপ টোটেম কোডেক ইনস্টলারটির মাধ্যমে ব্যবহারকারী দ্বারা ইনস্টল করা আছে suspect এছাড়াও, লিনাক্স-শিরোনামের সংস্করণগুলিও একত্রিত বলে মনে হচ্ছে, যদিও আমি কেবল অ সংস্করণ-নির্দিষ্ট মেটাপ্যাকেজ ইনস্টল করেছি। উদাহরণ:
libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29
এটা কিভাবে কাজ করে:
sed
স্ট্রিপগুলি রেখার শেষে বাকী সাদা স্থান ছেড়ে দেয়।অন্যান্য সম্ভাবনাও তেমন কাজ করে না:
ubuntu-14.04-desktop-amd64.manifest
ফাইলটি ( এখানে উবুন্টু 14.04 এর জন্য) ব্যবহার করা হচ্ছে /var/log/installer/initial-status.gz
। আরও প্যাকেজগুলি ম্যানুয়ালি ইনস্টল হিসাবে না দেখানো হয়েছে যদিও তা না থাকলেও।apt-mark showauto
পরিবর্তে ব্যবহার করা হচ্ছে /var/log/installer/initial-status.gz
। apt-mark
উদাহরণস্বরূপ, xserver-xorg প্যাকেজটি অন্তর্ভুক্ত নয়, যখন অন্য ফাইলটি করে।আমি রেফারেন্স হিসাবে অন্যান্য স্ট্যাক এক্সচেঞ্জ পোস্টগুলি ব্যবহার করেছি, তবে উপরের সমাধানের মতো কোনওটিই কাজ করে না:
উভয়ই উপরের সমাধানের চেয়ে বেশি প্যাকেজ তালিকাভুক্ত করে।
সম্পাদনা: আপনি যদি আগের প্রকাশ থেকে আপগ্রেড করেন তবে কী করবেন:
আপনি যদি উবুন্টুকে একটি মুক্তি থেকে পরের দিকে আপগ্রেড করেন তবে আপনার সম্ভবত এই প্রক্রিয়াটি সামঞ্জস্য করতে হবে। সেক্ষেত্রে আমি বর্তমান প্রকাশের প্রাথমিক-স্ট্যাটাস.gz ফাইল ছাড়াও নতুন প্রকাশের ম্যানিফেস্ট ফাইলটি (উপরে দেখুন) পরীক্ষা করবো। আপনি কেবল অন্য তুলনা যুক্ত করে সহজেই এটি করতে পারেন। মেনিফেস্ট ফাইলটি ব্যবহার করা কার্যকর হবে না, কারণ দুর্ভাগ্যক্রমে ম্যানিফেস্ট ফাইলটিতে প্রাথমিক_status.gz ফাইল যা করে না (আমি পরীক্ষা করেছিলাম)।
/var/log/installer/initial-status.gz
অনুপস্থিত। এছাড়াও আমি জানতে চাই যে এটি অ্যাপস চিহ্নিতকরণের উপর নির্ভর করে কিনা manual
?
showmanual
কমান্ডটি চালিয়েছি (নীচে)। এবং comm
দুটি (সাজানো) তালিকার তুলনা করতে ব্যবহার করুন। showmanual
ফলাফলের আমাকে 1,840 দিলেন আরো থেকে অনন্য প্যাকেজ apt-mark showmanual
না এই পদ্ধতি দ্বারা দেখানো হয়েছে। কোনও প্যাকেজই এই- comm
কম্যান্ডের আউটপুটে অনন্য ছিল না । আমি মনে করি এটি রেকর্ড করা আরও আকর্ষণীয় যে আমার পিসির জন্য 894 প্যাকেজগুলি উভয় ফলাফলের তালিকাভুক্ত। কেন এইরকম বিশাল তাত্পর্য আছে তা নিশ্চিত নয়। কিছু (অনেক?) প্যাকেজ রিলিজ নির্দিষ্ট বলে মনে হচ্ছে। এক্সওআরজি, জিটিকে উপাদান এবং lib*
জিনিসগুলির মতো অন্যান্য আপডেট হতে পারে। যাইহোক এই উত্তরটি খুব ভাল শুরু।
apt-mark showmanual
। এটি কতটা পার্থক্য দৃশ্যমান তা আকর্ষণীয়। আপনার তালিকায় 238 টি প্যাকেজ রয়েছে যখন শোম্যানুয়াল 1717 প্যাকেজ দেয়। 2179 ইনস্টল হওয়া প্যাকেজগুলির মধ্যে উভয় তালিকায় কেবল 223 টি রয়েছে, 15 টি কেবলমাত্র আপনার (উদাহরণ: নোডেজ, লাইটডিএম) এবং 223 টি কেবল শোম্যানুতে রয়েছে (উদাহরণস্বরূপ: xserver-xorg, উবুন্টু-ডেস্কটপ)। আপনার তালিকাটি আরও সহায়ক বলে মনে হচ্ছে তবে এই পার্থক্যগুলি কোথা থেকে এসেছে তা না জেনে সিদ্ধান্ত নেওয়া সহজ নয় ... (তবে আমি নিশ্চিত যে আমি নিজেই এনজিনেক্স এবং লাইটডিএম ইনস্টল করেছি ...) [দুঃখিত যে আমি শুধু লিখেছি একই;)]
প্যাকেজ অ্যাপের নতুন সংস্করণগুলিতে এপ-মার্ক কমান্ডও রয়েছে
apt-mark showmanual
linux-image-3.11.0-*-generic
linux-image-3.13.0-24-generic
ম্যানুয়াল তবে বর্তমান linux-image-3.13.0-27-generic
স্বয়ংক্রিয়। দেখে মনে হচ্ছে একটি রেফারেন্সিং প্যাকেজের একটি আপগ্রেড (এই ক্ষেত্রে linux-image-generic
, যা নির্ভরতা পরিবর্তন করেছে), ম্যানুয়াল চিহ্নটি স্বয়ংক্রিয়ভাবে সেট হয়ে গেছে
apt-get autoremove
। এটি অবশ্যই আপনি চান তা নয়।
উবুন্টু 16.04 এর জন্য, লগ ফাইলটি দেখুন /var/log/apt/history.log
।
উদাহরণ স্বরূপ:
zgrep 'Commandline: apt' /var/log/apt/history.log /var/log/apt/history.log.*.gz
এটি নিখুঁত নয়, তবে আমি নিজে হাতে কী ইনস্টল করেছি তা পরিষ্কার করে দেওয়া বেশ ভাল। একটি রাখুন -B 1
দেখতে যখন এটি ইনস্টল করা ছিল, grep উপর।
উদাহরণ আউটপুট
Commandline: apt install postgresql-9.5-plv8
Commandline: aptdaemon role='role-install-file' sender=':1.85'
Commandline: apt install task
Commandline: apt autoremove
Commandline: apt install atom
Commandline: apt upgrade
Commandline: apt-get install asciinema
Commandline: apt install iperf3
Commandline: apt upgrade
Commandline: apt-get install chromium-browser
Commandline: apt install joe cpanminus build-essential postgresql libdbd-pg-perl libcrypt-openssl-bignum-perl libcrypt-openssl-rsa-perl libio-socket-ssl-perl libnet-ssleay-perl libssl-dev
Commandline: aptdaemon role='role-commit-packages' sender=':1.2314'
Commandline: apt install git
Commandline: apt install sqlite
Commandline: apt install whois
Commandline: apt install libdbd-pg-perl
Commandline: apt install perl-doc
Commandline: apt upgrade
নিশ্চিত না যে এটি উঠেছে aptitude
কি না। উবুন্টু সফটওয়্যার ডেস্কটপ অ্যাপ্লিকেশন থেকে ইনস্টলগুলি নেওয়া হবে বলে মনে হয় না।
apt-mark showauto | grep -iE '^foobar$'
যদি প্যাকেজটি স্বয়ংক্রিয়ভাবে ইনস্টল করা থাকে তবে "ফুবার" আউটপুট দেবে, অন্যথায় কিছুই নয়।
aptitude search '!~M ~i'
যে প্যাকেজগুলি স্বয়ংক্রিয়ভাবে ইনস্টল করা হয়নি তাদের তালিকা তৈরি করবে। এটি একটি দুঃখের বিষয় প্রবণতা 10.10 থেকে শুরু করে উবুন্টু ডেস্কটপে ডিফল্ট ইনস্টলের অংশ হবে না।
aptitude search
সমস্ত প্যাকেজগুলি কেবল ম্যানুয়ালি ইনস্টল করা আছে তা দেখায় না (ওপি যা চেয়েছিল তা আমি ধরে নিয়েছি)
aptitude search '!~M ~i'
এবং এটি 1043 প্যাকেজ তালিকাভুক্ত করে। আমি বহু প্যাকেজ ম্যানুয়ালি ইনস্টল করার কোনও উপায় নেই।
নিম্নলিখিত স্ক্রিপ্টটি এমন সমস্ত প্যাকেজ মুদ্রণ করবে যা স্বয়ংক্রিয়ভাবে ইনস্টল করা হয়নি এবং সুতরাং ম্যানুয়ালি ইনস্টল করা হয়েছিল:
#!/usr/bin/python
try:
import apt_pkg
except ImportError:
print "Error importing apt_pkg, is python-apt installed?"
sys.exit(1)
apt_pkg.init()
STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states"
auto = set()
tagfile = apt_pkg.TagFile(open(STATE_FILE))
while tagfile.step():
pkgname = tagfile.section.get("Package")
autoInst = tagfile.section.get("Auto-Installed")
if not int(autoInst):
auto.add(pkgname)
print "\n".join(sorted(auto))
এটি স্বয়ংক্রিয়ভাবে ইনস্টল হওয়া প্যাকেজগুলি কীভাবে এপ-চিহ্ন প্রিন্ট করে তা নির্ভর করে।
sys.exit(1)
ছাড়াই import sys
অজগরটির নতুন সংস্করণগুলিতে ত্রুটি হতে পারে। হয় হয় import sys
বা ব্যবহার exit(1)
।
সমস্ত প্যাকেজগুলির তালিকা পেতে (ইনস্টল করা হয়নি, ব্যবহারকারী দ্বারা ইনস্টল করা আছে বা ডিফল্টরূপে ইনস্টল করা হয়েছে, সমস্ত পিপিএতে জুড়ে), apt
নিম্নলিখিত পদ্ধতিটি নিয়োগ করে:
apt list [option]
এর জন্য কার্যকর সম্ভাব্য বিকল্পগুলি হ'ল:
--installed
সিস্টেমে ইনস্টল করা কেবলমাত্র প্যাকেজগুলি প্রদর্শন করতে (প্রায় ৫০,০০০+ এর মধ্যে)
--manual-installed
সরাসরি কমান্ড দ্বারা স্পষ্টভাবে ইনস্টল করা প্যাকেজগুলির তালিকা করতে হয় সরাসরি হয় বা নির্ভরতা হিসাবে।
বিকল্পভাবে, আপনি করতে পারেন:
apt list --manual-installed | grep -F \[installed\]
প্যাকেজগুলির তালিকা পেতে যা কেবলমাত্র ব্যবহারকারী কমান্ড এবং কেবলমাত্র তাদের নির্ভরতাগুলির ফলে তৈরি হয়েছিল এবং সংস্করণ এবং আর্কিটেকচার সমর্থিত (x86, x86_64, amd64, সমস্ত, ইত্যাদি) এর মতো অতিরিক্ত তথ্য পেতে
যেমনটি বেশ কয়েকটি লোক মন্তব্য করেছেন, অ্যাপ্ট-চিহ্নের শোম্যানুয়ালটি কিছুটা বগি বলে মনে হচ্ছে (এবং আমি এটি বাগ 72২7777৯৯ হিসাবে রিপোর্ট করেছি )। আমি যখন এটি ব্যবহার করছি, এটি আসলে অনেকগুলি স্টাফের প্রতিবেদন করে যা এমনকি / var / lib / apt / विस्तारিত_স্টেটে লগড হয় না (যেখানে এটি সঞ্চিত বলে মনে করা হয়) এবং অ্যাপট-গেট ইনস্টল করা অবস্থায় লগইন করে না / var / lib / এপিটি / এক্সটেন্ডেড_স্টেটস (কেবলমাত্র / var / lib / dpkg / স্থিতিতে)। উপরের txwikinger দ্বারা অজগর স্ক্রিপ্টটি সরাসরি / var / lib / apt / વિસ્તૃત_স্টেটগুলি থেকে আঁকে তবে আপনি যদি আজ এটি ব্যবহার করেন তবে বাক্য গঠনটি কাজ করতে পারে না (আমার সবেমাত্র কুবুন্টু 13.10 দিয়ে ত্রুটি উত্পন্ন করা শুরু করেছে)। আপডেট করা বাক্য গঠনটি হ'ল:
#!/usr/bin/python
import sys
try:
import apt_pkg
except ImportError:
print "Error importing apt_pkg, is python-apt installed?"
sys.exit(1)
apt_pkg.init()
STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states"
auto = set()
tagfile = apt_pkg.TagFile(open(STATE_FILE))
while tagfile.step():
pkgname = tagfile.section.get("Package")
autoInst = tagfile.section.get("Auto-Installed")
if not int(autoInst):
auto.add(pkgname)
print "\n".join(sorted(auto))
আমার জন্য এটি 5 টি আইটেমের খুব সংক্ষিপ্ত তালিকা ছিল যা সঠিক বলে মনে হয় না।
sys.exit(1)
ছাড়াই import sys
অজগরটির নতুন সংস্করণগুলিতে ত্রুটি হতে পারে। হয় হয় import sys
বা ব্যবহার exit(1)
।
আমি একটি জিইউআই সমাধান দিতে চাই।
খোলা Synaptic Package Manager
যাও Status
ক্লিক Installed (manual)
এটি অ্যাপ্লিকেশন বা প্রবণতা দ্বারা ম্যানুয়ালি ইনস্টল করা প্যাকেজগুলির তালিকা দেবে।
দুর্ভাগ্যক্রমে আমি কোনও প্যাকেজ ম্যানুয়ালি বা স্বয়ংক্রিয়ভাবে ইনস্টল হয়েছিল Custom Filters
কিনা তা অনুসন্ধান করার জন্য কোনও বিকল্প খুঁজে পাইনি foobar
।
যদি প্যাকেজটি অধীন হয় Installed
তবে এর অধীনে না থাকে Installed (manual)
তবে এটি স্বয়ংক্রিয়ভাবে ইনস্টল হয়ে গেছে। যদি প্যাকেজটি এর অধীনে থাকে Installed (manual)
তবে এটি ম্যানুয়ালি ইনস্টল করা হয়েছিল।
যদি এপ্রি-কিছু আদেশ ব্যবহার করে কেউ আপনাকে সুন্দর উত্তর না দেয় তবে আপনি এটি হার্ড পদ্ধতিতে করতে পারেন । অ্যাপটি-গেট তার তথ্যগুলিকে / var / lib / অ্যাপ্ট / এক্সটেন্ডেড_স্টেটে সঞ্চয় করে। স্বয়ংক্রিয়ভাবে ইনস্টল হওয়া যে কোনও ফাইল এই ফাইলটিতে যুক্ত করা হবে। আপনি যদি এই ফাইলটিতে ইতিমধ্যে প্যাকেজটি ম্যানুয়ালি ইনস্টল করেন তবে প্যাকেজটি এই ফাইলে থেকে যাবে তবে স্বতঃ ইনস্টলড: দ্বিতীয় লাইনে 0 থাকবে 0 এটি মোছা হয়নি।
দ্রষ্টব্য: প্রত্যাশিত আরও ভাল উত্তরগুলি যা ফাইল প্লেসমেন্টে পরিবর্তনগুলি উপস্থিত হলে সম্ভবত কাজ করবে। ফাইলের অবস্থান সম্পর্কিত তথ্য কার্যকর হলে আমি আমার রাখি।
apt-get install liferea
এবং এটি ইনস্টল হয়নি তবে আমি আউটপুট পেয়েছি যা "ম্যানুয়ালি ইনস্টল হিসাবে চিহ্নিত" এর প্রভাব ছিল। এখন লাইফরিয়া ফাইলটিতে রয়েছে, পরের লাইনে একটি এর 0
পরিবর্তে একটি রয়েছে 1
। এছাড়াও, আপনার নিজের রেজেক্স প্যাটার্নটি " foobar$"
কেবলমাত্র পরিবর্তে পরিবর্তন করা উচিত foobar
।
অনেকগুলি গুগল করার পরে, আমি এই স্ক্রিপ্টটি একত্রিত করতে পরিচালিত করেছি। এটি আমার পক্ষে ঠিক কাজ করে:
# List of all packages currently installed
current=$(dpkg -l | awk '{print $2}' | sort | uniq)
# List of all packages that were installed with the system
pre=$(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort | uniq)
# List of packages that don't depend on any other package
manual=$(apt-mark showmanual | sort | uniq)
# (Current - Pre) ∩ (Manual)
packages=$(comm -12 <(comm -23 <(echo "$current") <(echo "$pre")) <(echo "$manual") )
for pack in $packages; do
packname=$(echo $pack | cut -f 1 -d ":")
desc=$(apt-cache search "^$packname$" | sed -E 's/.* - (.*)/\1/')
date=$(date -r /var/lib/dpkg/info/$pack.list)
echo "# $desc"
echo "# $date"
echo "sudo apt-get install $pack"
echo -e ""
done
sort -u
পরিবর্তে ব্যবহার করতে পারে sort | unique
। যেমন apt-mark
আর্কিটেকচার প্রদর্শন করে না, সেট অপারেশনগুলির (বা ব্যবহারের dpkg-query -W -f='${Package}\n'
) আগে আপনার dpkg এর আউটপুট থেকে এটি ছাঁটাই করা উচিত । এছাড়াও, dpkg কিছু প্যাকেজ তালিকাভুক্ত করতে পারে যা বর্তমানে ইনস্টল করা নেই। "ডেস্ক" হিসাবে, আপনি inary dpkg-query -W -f = '# $ {বাইনারি: সংক্ষিপ্তসার} \ n' $ প্যাকটি ব্যবহার করতে পারেন যা দ্রুত।
apt-mark
কিছু প্যাকেজগুলির জন্য আর্কিটেকচার প্রদর্শন করতে পারে তবে এতগুলি জন্য নয় dpkg -l
।
apt-cache search
ধীর. Help.ubuntu.com/commune/ListInstalledPackagesByDate এর মতো আরও কিছু ব্যবহার করে ইনস্টলড তারিখগুলির একটি তালিকা আগে থেকে পাওয়া আরও কার্যকর হতে পারে
লি লো যেমন বলেছেন, apt-mark showauto
আপনার নিজেরাই স্বয়ংক্রিয়ভাবে ইনস্টল হওয়া জিনিসের একটি চর্বিযুক্ত তালিকা পাওয়া উচিত।
ম্যানুয়ালি ইনস্টল করা জিনিসগুলি এখন দেখানোর জন্য, এটি প্রবণতাটির জন্য একটি সুন্দর সরল অনুসন্ধান সংশোধক আছে out তবে আপনি এটি করতে চান না। আপনি একটি বিশাল বাশ কমান্ড লিখতে চান যা কিছু রকেট বিজ্ঞান করে।
দ্রষ্টব্য: আপনি আপনার সমস্ত বন্ধুকে বিশাল ব্যাশ কমান্ড খুঁজে বের করতে কতটা শীতল দেখবেন তা এটি আরও চিত্রণ।
comm -3 <(dpkg-query --show -f '${Package} ${Status}\n' | \n
grep "install ok installed" | cut --delimiter=' ' -f 1) <(apt-mark showauto)
পাঠযোগ্যতার জন্য আমি দুটি লাইনে এটি ভেঙে দিয়েছি। এটি কি করে?
apt-mark
comm -3 <(dpkg -l | grep '^ii' | cut -d \ -f 3|sort) <(apt-mark showauto|sort)
যথাযথভাবে উন্নত;)
এটি ম্যানুয়ালি ইনস্টল করা সমস্ত প্যাকেজ তালিকাভুক্ত করবে: নির্ভরতা, আনইনস্টল প্যাকেজগুলি, সিস্টেম ইনস্টলেশনের সময় ইনস্টল হওয়া প্যাকেজগুলি।
unopts() {
in=`cat`
echo "$in" | sed -r 's/ --[^ ]+//g;s/ -[^ ]+//g'
}
list() {
cat '/var/log/apt/history.log' |
grep --color=never -v '\-o APT::Status-Fd=4 \-o APT::Keep-Fds::=5 \-o APT::Keep-Fds::=6' |
egrep --color=never "Commandline: apt-get.* $1" |
sed -r "s/Commandline: apt-get//;s/ $1//" |
unopts |
tr ' ' '\n' |
sed '/^$/d'
}
hapt() {
tmp=`mktemp -d`
installed=$tmp/installed
deleted=$tmp/deleted
dpkg=$tmp/dpkg
list 'install' > $installed
list '(remove|purge|autoremove)' > $deleted
dpkg --get-selections |
grep -v 'deinstall' |
cut -f 1 > $dpkg
while read package
do
sed -i "0,/$package/{//d;}" $installed
done < $deleted
while read package
do
if [ -z "`grep --color=never "^$package$" $dpkg`" ]
then
sed -i "0,/$package/{//d;}" $installed
fi
done < $installed
cat $installed
rm -r $tmp
}