শীর্ষ স্তরের ম্যানুয়ালি ইনস্টল করা প্যাকেজগুলির নির্ভরতা ছাড়াই তাদের তালিকা করুন


12

ম্যানুয়ালি ইনস্টল করে প্যাকেজগুলি দেখানোর অনেকগুলি উপায় রয়েছে aptযেমন:

apt-mark showmanual

কিন্তু কখনও কখনও যে আউটপুট খুব বেশি। উদাহরণস্বরূপ, যদি ব্যবহারকারী নিজে প্যাকেজ ইনস্টল করে foo:

apt-get install foo

... এবং এর fooউপর নির্ভর করে barএবং bazতারপরে apt-mark showmanualআউটপুট হবে:

bar
baz
foo

আমরা কীভাবে কেবলমাত্র শীর্ষ স্তরের ম্যানুয়ালি ইনস্টল করা প্যাকেজগুলি ( যেমন foo ) তাদের নির্ভরতা ছাড়াই ( যেমন না baz, না bar) তালিকাভুক্ত করতে পারি ?


নিম্নলিখিত কোডটি কাজ করছে বলে মনে হচ্ছে, তবে কয়েকশবার বার parallelকল করা জিএনইউapt-rdepends খুব ধীর, (চারটি সিপিইউ সহ তিন ঘন্টা):

apt-mark showmanual | 
tee /tmp/foo | 
parallel "apt-rdepends -f Depends,PreDepends,Suggests,Recommends {} |
          tail +2" 2> /dev/null | 
tr -s ' ' '\n' | 
grep -v '[():]' | 
sort -Vu | 
grep -wv -f - /tmp/foo

হুম। উত্তরগুলি, এবং ওপি কোডগুলি এতগুলি আলাদা এবং কিছুটা আলাদা ডেটা ফেরত দেয়, যে পদ্ধতির ডেটা সবচেয়ে সঠিক তা নিয়ে আমি কিছুটা अस्पष्ट হয়ে যাচ্ছি। একটি সর্বনিম্ন পরীক্ষা ব্যবস্থা থেকে শুরু করে এবং আউটপুট কীভাবে এবং কখন পরিবর্তিত হয় তা দেখার জন্য একটি সমীক্ষার উত্তর প্রয়োজন Perhaps
এগ্রি

উত্তর:


9

পাইথন অ্যাপ্ট এপিআই ব্যবহার করে এটি করা যেতে পারে। আপনি যে প্যাকেজগুলি দেখতে পাচ্ছেন apt-mark showmanualসেগুলি হ'ল apt.cache.Cache()যার is_installedজন্য সত্য এবং is_auto_installedমিথ্যা। তবে, নির্ভরতাগুলি প্রক্রিয়া করা সহজ:

#! /usr/bin/env python3

from apt import cache

manual = set(pkg for pkg in cache.Cache() if pkg.is_installed and not pkg.is_auto_installed)
depends = set(dep_pkg.name for pkg in manual for dep in pkg.installed.get_dependencies('PreDepends', 'Depends', 'Recommends') for dep_pkg in dep)

print('\n'.join(pkg.name for pkg in manual if pkg.name not in depends))

এমনকি এই তালিকার কিছু প্যাকেজ যা আমি সেখানে দেখতে (আশা করবেন না init, grep?!)।


আমার সিস্টেমে কোডটি আমার 3-ঘন্টা কোডের একটি সুপারসেটকে আউটপুট দেয় তবে এর মতো কোনও আশ্চর্যতা দেখায় না initএবং grep(সম্ভবত আপনার অ্যাপ্লিকেশন ডেটাটি দূষিত?), এছাড়াও এটি অনেকগুলি লাইব্রেরি দেখায়। OTOH, আমার 3-ঘন্টার কোডটিতে কয়েকটি আইটেম মিস করা উচিত যা উপরের pythonকোডটি প্রিন্ট করে। সম্ভবত হারিয়ে যাওয়া আইটেমগুলি ইনস্টল করা হয়নি apt
এগ্রি

@agc এর কারণ সম্ভবত আমি পুনরাবৃত্তি করিনি। আমি উইকএন্ডের পরে পুনরাবৃত্তির বিকল্পটি চেষ্টা করব। এমনকি পুনরাবৃত্তির সঙ্গে, যদিও, আমি এই আহ্বান তুলনায় দ্রুততর উপায় হতে আশা করতে চাই বারবার কার্যক্ষম-rdepends
muru

উপরের pythonকোডটি আমার কোডের (৩ ঘন্টা) চেয়ে 3600 গুণ বেশি দ্রুত (যেমন এটি 3 সেকেন্ড নিয়েছে)। পুনরাবৃত্ত সংস্করণটি পরীক্ষা করার জন্য অপেক্ষা করছি ...
এ.সি.সি

3

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

function get_installed_packages() {
    apt list --installed | sed 's#/.*##'
}

function get_installed_packages_with_deps() {
    dpkg-query --show --showformat '${Package} ${Depends} \
        ${Pre-Depends}\n' $(get_installed_packages) | 
    sed 's/ ([^(]*)//g; s/:any\|,//g'
}

function get_package_relations() {
    awk '{print $1 " " $1; for(i = 2; i <= NF; i++) print $1 " " $i;}'
}

function add_marker() {
    echo "~ ~"
}

function resolve_parents() {
    tsort | sed -n '1,/~/ p' | head -n -1
}

(get_installed_packages_with_deps | get_package_relations; add_marker) | 
resolve_parents

আমি tsortএই স্ক্রিপ্ট ব্যবহার । আমি ধরে নিয়েছি যে নির্ভরতা ছাড়াই শেষে যখন কোনও মার্কার যুক্ত করা হয় তখন মার্কারটিও আমার ফলাফলের নির্ভরতা ছাড়াই শেষ প্রবেশ করবে entry সুতরাং আমি নির্ভরতা ছাড়াই শেষ প্যাকেজ এবং হ্রাসের সাথে প্রথম প্যাকেজের মধ্যে পার্থক্য করতে পারি।

আমি এই সমাধানটিতে একটি সমস্যা লক্ষ্য করেছি:
নির্ভরতা গ্রাফটিতে চক্র রয়েছে। যারা এন্ট্রি দ্বারা উপেক্ষা করা হয় tsort


2

নিম্নলিখিত 1 টি স্তরের নির্ভরতা ছাড়াই আপনি সমস্ত ম্যানুয়ালি ইনস্টল করা প্যাকেজগুলি সন্ধান করতে পারেন:

apt-mark showmanual | sort > manually-installed.txt

apt show $(apt-mark showmanual) 2>/dev/null | 
grep -e ^Depends -e ^Pre-Depends > deps1.txt

cat deps1.txt | 
sed 's/^Depends: //; s/^Pre-Depends: //; 
     s/(.*)//g; s/:any//g' > deps2.txt

cat deps2.txt | tr -d ',|' | tr ' ' '\n' | grep -v ^$ |
sort -u > all-dep-packages.txt

grep -v -F -f all-dep-packages.txt manually-installed.txt

আপনি নিম্নলিখিত ওয়ান লাইনার যাদুটি ব্যবহার করতে পারেন:

apt-mark showmanual | sort | grep -v -F -f <(apt show $(apt-mark showmanual) 2> /dev/null | grep -e ^Depends -e ^Pre-Depends | sed 's/^Depends: //; s/^Pre-Depends: //; s/(.*)//g; s/:any//g' | tr -d ',|' | tr ' ' '\n' | grep -v ^$ | sort -u)

অনেক দ্রুত. এটি বেশিরভাগই ওপি কোডের সুপারস্টেটকে আউটপুট করে তবে এটি dasherপ্যাকেজের মতো কয়েকটিও মিস করে । আমার সিস্টেমে ওপি কোড পাইপযুক্ত 475 লাইন sort -Vআউটপুট , মুড়ুর কোড আউটপুট 914 লাইন, (সহ ), এবং এই উত্তরের কোড 995 লাইন আউটপুট করে। dasher
এজিসি

হ্যাঁ, আমার স্ক্রিপ্ট সম্পূর্ণ নির্ভরতা গাছ বিবেচনা করে না। আপনি আরও স্তরক্রমের স্তরের জন্য এটি খাপ খাইবার চেষ্টা করতে পারেন।
সিলার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.