मैं पैकेजों की एक सूची मैन्युअल रूप से स्थापित करना चाहता हूं 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)
बहुत कम संकुल अभी भी, दरारें के माध्यम से गिर हालांकि मैं इन पर शक कर रहे हैं वास्तव में उपयोगकर्ता द्वारा स्थापित है, या तो भाषा स्थानीयकरण सेटअप के माध्यम से स्थापना के बाद सही है या कुलदेवता कोडेक इंस्टॉलर के माध्यम से जैसे। इसके अलावा, लिनक्स-हेडर संस्करण भी जमा होने लगते हैं, भले ही मैंने केवल गैर-संस्करण-विशिष्ट रूपक स्थापित किया हो। उदाहरण:
libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29
यह कैसे काम करता है:
sed
स्ट्रिप्स लाइन के अंत में शेष व्हाट्सएप से बाहर निकलते हैं।अन्य संभावनाएं भी काम नहीं करती हैं:
ubuntu-14.04-desktop-amd64.manifest
फ़ाइल का उपयोग कर ( यहां Ubuntu 14.04 के लिए) /var/log/installer/initial-status.gz
। अधिक पैकेज मैन्युअल रूप से इंस्टॉल किए गए दिखाए जाते हैं, भले ही वे न हों।apt-mark showauto
बजाय का उपयोग कर /var/log/installer/initial-status.gz
। apt-mark
उदाहरण के लिए, xserver-xorg पैकेज शामिल नहीं है, जबकि दूसरी फ़ाइल करती है।मैंने संदर्भ के रूप में विभिन्न अन्य StackExchange पोस्ट का उपयोग किया, हालांकि कोई भी काम नहीं करता है और साथ ही उपरोक्त समाधान:
दोनों उपरोक्त समाधान की तुलना में अधिक संकुल को सूचीबद्ध करते हैं।
संपादित करें: यदि आपने पिछली रिलीज़ से अपग्रेड किया है तो क्या करें:
यदि आपने उबंटू को एक रिलीज से अगले तक अपग्रेड किया है, तो आपको संभवतः इस प्रक्रिया को समायोजित करने की आवश्यकता होगी। उस स्थिति में, मैं वर्तमान रिलीज़ से प्रारंभिक-स्थिति के अलावा नई रिलीज़ की प्रकट फ़ाइल (ऊपर देखें) की जाँच करूँगा। आप बस एक और तुलना जोड़कर आसानी से कर सकते हैं। सिर्फ मेनिफ़ेस्ट फ़ाइल का उपयोग करने से काम नहीं चलेगा, क्योंकि मेनिफ़ेस्ट फ़ाइल दुर्भाग्यवश वह सब कुछ नहीं रखती है जो आरंभिक_स्टैटस.गज़ फ़ाइल करती है (मैंने जाँच की)।
/var/log/installer/initial-status.gz
गायब है। इसके अलावा, मैं जानना चाहता हूं कि क्या यह एप्टस मार्किंग के आधार पर है manual
या नहीं?
showmanual
कमांड (नीचे) चलाई । और comm
दो (क्रमबद्ध) सूचियों की तुलना करने के लिए उपयोग करें। showmanual
परिणाम मुझे 1,840 दिया और अधिक से अद्वितीय संकुल apt-mark showmanual
नहीं इस विधि द्वारा दिखाया गया है। comm
NO- पैकेज इस -कमांड के आउटपुट के लिए अद्वितीय थे । मुझे लगता है कि मेरे पीसी के लिए रिकॉर्ड करना अधिक दिलचस्प है, दोनों परिणामों में 894 पैकेज सूचीबद्ध हैं। यकीन नहीं है कि इस तरह की एक विसंगति क्यों है। कुछ (कई?) पैकेज विशिष्ट रिलीज़ होते प्रतीत होते हैं। अन्य XOrg, GTK घटकों और lib*
चीजों को अपडेट किया जा सकता है। वैसे भी यह जवाब बहुत अच्छी शुरुआत है।
apt-mark showmanual
। यह दिलचस्प है कि कितने अंतर दिखाई देते हैं। आपकी सूची में 238 पैकेज हैं जबकि शोमैनुअल 1717 पैकेज हैं। 2179 स्थापित पैकेजों में, दोनों सूचियों में केवल 223 हैं, 15 केवल आप में हैं (उदाहरण: नोडज, लाइटमेड) और 223 केवल शोमैनुअल में हैं (उदाहरण: xserver-xorg, ubuntu-desktop)। ऐसा लगता है कि आपकी सूची अधिक उपयोगी है, लेकिन बिना ये जाने कि ये अंतर कहां से आया है, यह तय करना आसान नहीं है ... (लेकिन मुझे पूरा यकीन है कि मैंने मैन्युअल रूप से nginx और lightdm स्थापित किया है ...) [क्षमा करें कि मैंने अभी लिखा है वही;)]
पैकेज apt के नए संस्करणों में, apt-mark कमांड भी है
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
। यह निश्चित रूप से वह नहीं है जो आप चाहते हैं।
Ubuntu 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
या नहीं। यह Ubuntu सॉफ्टवेयर डेस्कटॉप ऐप से इंस्टॉल लेने के लिए प्रतीत नहीं होता है।
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))
यह इस बात पर आधारित है कि स्वचालित रूप से इंस्टॉल किए गए पैकेजों पर apt-mark कैसे प्रिंट करता है।
sys.exit(1)
बिना उपयोग कर import sys
सकते हैं। या तो import sys
उपयोग करें exit(1)
।
सभी पैकेजों की एक सूची प्राप्त करने के लिए (स्थापित नहीं, उपयोगकर्ता द्वारा स्थापित या डिफ़ॉल्ट रूप से, सभी PPAs में स्थापित), apt
निम्नलिखित कार्य करता है:
apt list [option]
इसके लिए उपयोगी संभावित विकल्प हैं:
--installed
केवल उन पैकेजों को प्रदर्शित करने के लिए जो सिस्टम पर इंस्टॉल किए गए हैं (कुछ 50,000+ में से)
--manual-installed
उन पैकेजों को सूचीबद्ध करने के लिए जो स्पष्ट रूप से एक कमांड द्वारा सीधे या निर्भरता के रूप में स्थापित किए गए थे ।
वैकल्पिक रूप से, आप कर सकते हैं:
apt list --manual-installed | grep -F \[installed\]
उन पैकेजों की एक सूची प्राप्त करने के लिए जो केवल उपयोगकर्ता कमांड और उनकी निर्भरता से उत्पन्न हुए थे, और उन पर अतिरिक्त जानकारी प्राप्त करने के लिए जैसे कि संस्करण और आर्किटेक्चर समर्थित (x86, x86_64, amd64, all, आदि)
जैसा कि कई लोगों ने टिप्पणी की है, apt-mark शोमैनुअल थोड़ा बुग्गी लगता है (और मैंने इसे बग 72729999 के रूप में रिपोर्ट किया है )। जब मैं इसका उपयोग कर रहा हूं, यह वास्तव में बहुत सारे सामानों की रिपोर्ट करता है जो लॉग इन नहीं किए गए हैं / var / lib / apt / Extended_states (जहां यह संग्रहीत किया जाना है) और apt-get लॉगिंग चीजों को इंस्टॉल किए गए अनुसार नहीं है / var / lib / apt / Extended_states (सिर्फ / var / lib / dpkg / स्थिति में)। ऊपर txwikinger द्वारा अजगर स्क्रिप्ट सीधे / var / lib / apt / Extended_states से आ रही है, लेकिन अगर आप आज इसका उपयोग कर रहे हैं तो सिंटैक्स काम नहीं कर सकता है (मेरा सिर्फ Kubuntu 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)
।
मैं एक GUI समाधान देना चाहूंगा।
खुला Synaptic Package Manager
के लिए जाओ Status
क्लिक करें Installed (manual)
यह उपयुक्त या एप्टीट्यूड द्वारा मैन्युअल रूप से स्थापित पैकेजों की सूची देगा।
दुर्भाग्य से मुझे यह पता लगाने के लिए कोई विकल्प नहीं मिला Custom Filters
कि क्या कोई foobar
पैकेज मैन्युअल रूप से या स्वचालित रूप से स्थापित किया गया था।
यदि पैकेज के तहत है, Installed
लेकिन Installed (manual)
उसके तहत नहीं है तो यह स्वचालित रूप से स्थापित किया गया था। यदि पैकेज के तहत है Installed (manual)
तो इसे मैन्युअल रूप से स्थापित किया गया था।
अगर कोई आपको apr-something कमांड का उपयोग करके एक अच्छा जवाब नहीं देता है तो आप इसे कठिन तरीके से कर सकते हैं । Apt-get अपनी जानकारी को / var / lib / apt / Extended_states में संग्रहीत करता है। स्वचालित रूप से स्थापित की गई कोई भी फ़ाइल इस फ़ाइल में जोड़ दी जाएगी। यदि आप मैन्युअल रूप से इस फ़ाइल में पहले से ही एक पैकेज स्थापित करते हैं, तो पैकेज इस फ़ाइल में रहेगा लेकिन दूसरी पंक्ति में ऑटो-स्थापित: 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 कुछ पैकेजों को सूचीबद्ध कर सकता है जो वर्तमान में स्थापित नहीं हैं। "Desc" के लिए, आप 'dpkg-query -W -f =' # $ {बाइनरी: सारांश} \ n '$ पैक का उपयोग कर सकते हैं, जो कि तेज़ है।
apt-mark
कुछ पैकेजों के लिए वास्तुकला प्रदर्शित कर सकते हैं, लेकिन इतने सारे के लिए नहीं dpkg -l
।
apt-cache search
धीमा है। अग्रिम में की तरह कुछ का उपयोग कर स्थापित दिनांकों की सूची प्राप्त करना help.ubuntu.com/community/ListInstalledPackagesByDate अधिक कुशल हो सकता है
जैसा कि ली लो ने कहा, apt-mark showauto
आपको स्वचालित रूप से स्थापित चीजों की एक मोटी सूची प्राप्त करनी चाहिए।
अब चीजों को मैन्युअल रूप से स्थापित करने के लिए, यह पता चलता है कि अभिवृत्ति के लिए एक सुंदर सरल खोज संशोधक है। लेकिन आप ऐसा नहीं करना चाहते हैं। आप एक विशाल बैश कमांड लिखना चाहते हैं जो कुछ रॉकेट साइंस करता है।
नोट: यह इस बात का अधिक चित्रण है कि आप अपने सभी दोस्तों को बड़े पैमाने पर बैश आदेशों का भंडाफोड़ करते हुए कितने शांत दिखेंगे।
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
}