मैन्युअल रूप से इंस्टॉल किए गए पैकेज कैसे ढूंढें?


48

मैंने अपने कंप्यूटर पर एक सादा Ubuntu 10.10 स्थापित किया और apt-get के माध्यम से कुछ सॉफ़्टवेयर स्थापित किए। पिछले हफ्ते मैं सब कुछ तोड़ने में कामयाब रहा और बस खरोंच से शुरू हुआ, और मुझे अपने सॉफ़्टवेयर को फिर से स्थापित करने की आवश्यकता है। क्या सभी पैकेजों के साथ एक सूची बनाने का कोई तरीका है जो मैंने मैन्युअल रूप से स्थापित किया है?

ताकि यह मुझे एक सूची दे जैसे texlive, ...और नहीं texlive, texlive-dep1, textlive-dep2, ...और सभी मानक पैकेज हटा दिए गए?

अगर मैं किसी तरह पता लगा सकता हूं कि मैंने नियमित रूप से इंस्टॉल किए गए प्रोग्रामों में से कौन सा हटाया है, तो यह बहुत बढ़िया होगा!


अद्यतन 2015-05-23: मैं अब अपने सिस्टम पर कॉन्फ़िगरेशन प्रबंधन के रूप में Ansible का उपयोग करता हूं। वहाँ मैं संकुल को स्थापित करने के लिए निर्दिष्ट करता हूँ। यह एक नए सिस्टम पर सभी कार्यक्रमों को स्थापित करते हुए, और भी बेहतर, लक्ष्य को पूरा करता है। तो यह प्रश्न कुछ प्रकाश विन्यास प्रबंधन में प्रवेश हो सकता है।

जवाबों:


24

इस सुझाव के साथ, मैं मान रहा हूँ कि आपकी पुरानी स्थापना अभी भी बूट होगी!

किसी अन्य मशीन पर संकुल के एक सेट को दोहराने के लिए:

सिस्टम A पर, चलाएँ:

dpkg --get-selections | grep -v deinstall > my-selections

my-selectionsफ़ाइल को सिस्टम B पर ले जाएँ ।

सिस्टम B पर, चलाएँ:

dpkg --set-selections < my-selections

और फिर:

sudo apt-get dselect-upgrade

महत्वपूर्ण नोट: यदि आपने गैर-मानक रिपॉजिटरी और / या पीपीए से पैकेज स्थापित किए हैं, तो आप अपग्रेड को चलाने से पहले सिस्टम ए से सिस्टम बी तक /etc/apt/sources.listकी सामग्री को कॉपी करना चाहेंगे /etc/apt/sources.list.d/

आप यह dpkgदेखने के लिए उपयोग कर सकते हैं कि आपने क्या हटाया है (NB: इसमें वे पैकेज भी शामिल होंगे जिन्हें आपने मैन्युअल रूप से स्थापित किया है और हटाया है):

dpkg --get-selections | grep deinstall

आप अपने परिणामों को टर्मिनल में देख सकते हैं, या, निश्चित रूप से किसी फ़ाइल पर रीडायरेक्ट कर सकते हैं।


9
मैं सभी पैकेजों की एक सूची प्राप्त करना चाहूंगा, लेकिन मैं केवल उन पैकेजों के नाम लेना चाहूंगा जिन्हें मैंने स्पष्ट रूप से स्थापित किया है। तो बस somethingऔर something-commonसाथ ही नहीं ।
मार्टिन यूडिंग

6
हाँ जबकि यह उपयोगी है, यह वह नहीं करता जो सवाल पूछता है।
टिम्मम

3
यदि आप ऐसा करते हैं, तो प्रोग्रामों को हटाते समय स्वतः-स्थापित निर्भरताएँ कभी साफ़ नहीं होंगी। लोग ऐसा जवाब क्यों देते हैं, जो पूछने वाले ने विशेष रूप से कहा कि वह नहीं चाहता था?
jbo5112

20

Superuser.com का यह धागा इसका समाधान देता है:

aptitude search '?installed ?not(?automatic)'

2
यह मेरे लिए काम नहीं करता है। बस स्थापित की गई सभी चीजों को सूचीबद्ध करता है, या निश्चित रूप से अधिक से अधिक मैंने स्पष्ट रूप से पूछा है।
टिम्मम्म

यह आपके द्वारा इंस्टॉल की गई सभी चीजों को सूचीबद्ध करता है apt-get, साथ ही उनकी निर्भरता भी। इसलिए, उदाहरण के लिए, यदि आप स्थापित करते हैं aptitude, तो यह भी सूचीबद्ध होगाapt-xapian-index aptitude-common libboost-iostreams1.54.0 libclass-accessor-perl libcwidget3 libept1.4.12 libio-string-perl libparse-debianchangelog-perl libsigc++-2.0-0c2a libsub-name-perl libtimedate-perl libxapian22 python-chardet python-debian python-six python-xapian
Runemoro

10

यदि आपके उपयुक्त लॉग / var / log / apt में हैं, तो कुछ इस तरह काम करना चाहिए:

gunzip -c /var/log/apt/history.log.*.gz | grep "apt-get install"

या यदि आप आउटपुट में कुछ दोहराए गए कबाड़ से छुटकारा पाना चाहते हैं:

gunzip -c /var/log/apt/history.log.*.gz | grep "apt-get install" \
  | cut -f4- -d" " | sort | uniq

6

आप apt-mark का उपयोग कर सकते हैं , लेकिन मैं debfoster की सलाह देता हूं :

sudo apt-get install debfoster
sudo debfoster

यह सभी स्थापित पैकेजों का निरीक्षण करेगा और यह पता लगाएगा कि कौन लोग दूसरों को स्थापित कर रहे हैं:

texlive-full is keeping the following 161 packages installed:
  cm-super cm-super-minimal context doc-base dvipng feynmf
  fonts-gfs-artemisia fonts-gfs-baskerville fonts-gfs-bodoni-classic
  ...
Keep texlive-full? [Ynpsiuqx?], [H]elp:

जैसा कि आप प्रत्येक प्रश्न के लिए "y" का उत्तर देते हैं (बस जल्दी से आगे बढ़ने के लिए Enter दबाएं), debfoster पैकेज सूची एकत्र करेगा और उन्हें फ़ाइल द्वारा लाइन-बाय-लाइन लिख देगा। डिफ़ॉल्ट रूप से यह पर है /var/lib/debfoster/keepers। यह इस तरह दिख रहा है:

gnome-do
texlive-full
...

मैं के माध्यम से debfoster कॉन्फ़िगर /etc/debfoster.confपर इस सूची डाल करने /etc/debfoster-keepersके साथ फाइल और ट्रैक etckeeper इतिहास और बैकअप रखने के लिए। यहाँ उत्तर दिखाता है कि एक नई-सीमांकित पाठ फ़ाइल से संकुल की सूची कैसे स्थापित करें:

sudo apt-mark manual $(cat debfoster-keepers)

यहां एक सीमा पर ध्यान दें, आपके द्वारा दिए गए पैकेज में उनके सामने एक '-' है। इसलिए आप apt-mark को कॉल करने से पहले उन लाइनों को हटाना चाहते हैं।

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

अपने विकल्पों को समझाने के लिए debfoster प्रॉम्प्ट पर "h" टाइप करें। प्रकार "?" पैकेज विवरण देखने के लिए। यहाँ कैसे उपयोगी हो सकता है।


5
comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

सभी मैन्युअल रूप से स्थापित पैकेज देता है (सिस्टम पैकेज नहीं, निर्भरता नहीं)। उदाहरण के लिए यह दिखाता है build-essentialलेकिन नहीं gcc


3

जो लोग apt- * टूल का उपयोग करना पसंद करते हैं, उनके लिए apt-mark उपयोगिता है जो मैन्युअल / ऑटो स्थिति को क्वेरी और संशोधित करने की अनुमति देती है।

apt-mark showmanual

आप जिन पैकेजों में रुचि रखते हैं, उनके लिए पैटर्न भी निर्दिष्ट कर सकते हैं:

apt-mark showmanual qemu\*

यह टिकट है।
जॉन वॉन न्यूमैन

2

मैं आखिरकार अब मिल गया:

outfile="$(mktemp)"
pattern='(\[INSTALLIEREN\]|\[INSTALL\])'

if [[ -f "/var/log/aptitude.1.gz" ]]
then
        gunzip -c /var/log/aptitude.*.gz | grep -E "$pattern" | awk '{ print $2; }' > "$outfile"
fi

if [[ -f "/var/log/aptitude" ]]
then
        grep -E "$pattern" "/var/log/aptitude" | awk '{ print $2; }' >> "$outfile"
fi

sort "$outfile"
rm "$outfile"

2
मुझे लगता है कि यह केवल तभी काम करता है जब आप केवल एप्टीट्यूड का उपयोग करके पैकेज स्थापित करते हैं। /var/log/apt/history.log(.N.gz)हालांकि इसमें समान फाइलें हैं ।
टिम्मम्म

आप zgrepइसके बजाय gunzipया zcatपाइप से उपयोग कर सकते हैं grep। यह एक रैपर लिपि है, जो जिप्पी के साथ जहाजों का मानना ​​है। यह असम्पीडित फ़ाइलों को भी स्वीकार करता है, इसलिए आप अपनी स्क्रिप्ट को सरल बना सकते हैंzgrep -E '(\[INSTALLIEREN\]|\[INSTALL\])' /var/log/aptitude* | awk '{ print $2 }'
स्टीव बुज़ोनास

2

मैं / var / log / apt / में लॉग फाइल खोलकर सब कुछ खींचने में सक्षम हूं

मैं तब अंदर जाता हूं और apt-get install पैकेज को मैन्युअल रूप से फिल्टर करता हूं। इस प्रोग्राम को करने का एक तरीका हो सकता है लेकिन मुझे इसकी जानकारी नहीं है।


1
cd /var/log/apt
cat  history.log | grep Commandline

इस तरह आप अतीत में किए गए आदेशों की सूची देखते हैं।

यदि आपको अधिक जानकारी चाहिए तो grep कोड निकालें:

less history.log

यदि लॉग संकुचित है (अर्थात gz के साथ समाप्त)

gunzip <filename>

समाप्त होने पर इसे फिर से ज़िप करने के लिए आप कर सकते हैं:

gzip <filename>

1
लॉग फ़ाइलों को अनकम्प्रेस्ड और पुनः शामिल करने के बजाय, उपयोग क्यों नहीं किया जाता है zcat? यह जितना आसान है zcat filename.gz। एक बस के स्थान पर gzip संपीड़ित फ़ाइलों पर इसका उपयोग कर सकते हैं cat। इसके अलावा , जैसे, के grepसाथ प्रतिस्थापित किया जा सकता है । zgrepzgrep Commandline history.log.1.gz
लार्जो

आपके विचार के आधार पर मैं एक कमांड लाइन लेकर आया हूँ (grep "Commandline" history.log ; zgrep "Commandline" history.log.*.gz ) | grep " install " | grep -v -- "--yes" | sed -r "s/^.*install //":। इसमें खामियां हैं, क्योंकि हटाए गए पैकेज भी सूचीबद्ध हैं, और यदि पैकेज एक से अधिक बार स्थापित किया गया था, तो इसे कई बार सूचीबद्ध किया जाता है।
लार्जो

1

मुझे यहां कोई समाधान नहीं दिखाई दिया, मेरे लिए काम करते हैं, मैंने dpkg के साथ काफी डिबेट पैकेज स्थापित किए हैं और कुछ आइटम जिन्हें मैं विशेष रूप से देख रहा था गायब थे।

एक लंबा एक लाइनर, लेकिन कॉपी और पेस्ट करने के लिए सुविधाजनक होगा:

export DPKG_INITIAL=$(mktemp) DPKG_INSTALLED=$(mktemp) DPKG_CUSTOM=$(mktemp) DPKG_DEPS=$(mktemp) zgrep -E '^Package' /var/log/installer/initial-status.gz | awk '{ print $2 }' > $DPKG_INITIAL ; awk '$3 !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", $3) ; gsub(/:.+/, "", $4) ; a[$4]=$3 } END { for (p in a) { if (a[p] == "install") { print p } } }' /var/log/dpkg.log | sort -u > $DPKG_INSTALLED ; comm -23 installed initial > $DPKG_CUSTOM ; function rdep() { apt-cache rdepends $1 | tail -n +3 | sed -e 's/^ //' -e '/^ /d' | cut -d':' -f1 | sort -u; } ; echo "$(for i in $(cat custom) ; do rdep $i ; done)" | sort -u > $DPKG_DEPS ; comm -23 custom deps > my-packages ; rm $DPKG_INITIAL $DPKG_INSTALLED $DPKG_CUSTOM $DPKG_DEPS

उपरोक्त कमांड आपके वर्तमान कार्यशील निर्देशिका में फ़ाइल के लिए संकुल की सूची सहेजती है my-packages

व्याख्या

मैंने पहली बार उन पैकेजों की एक सूची बनाई है, जो स्थापना के दौरान चुने गए पैकेजों की आधार रेखा से बना है।

zgrep -E '^Package' /var/log/installer/initial-status.gz | awk '{ print $2 }' > initial

सामान्य रूप से स्थापित वस्तुओं की एक लंबी सूची के अनुसार।

awk '$3 !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", $3) ; gsub(/:.+/, "", $4) ; a[$4]=$3 } END { for (p in a) { if (a[p] == "install") { print p } } }' /var/log/dpkg.log | sort -u > installed

फिर मैंने दो फाइलों की तुलना की initialऔर installedकेवल उन वस्तुओं को सूचीबद्ध किया, जो स्थापित करने के लिए अद्वितीय हैं।

comm -23 installed initial > custom

वहां से मैं निर्भरताओं को फ़िल्टर करना चाहता था, यह वह जगह है जहां यह विधि कुछ वांछित पैकेजों को याद कर सकती है, यह उन निर्भरताओं से अनजान है जो स्पष्ट रूप से स्थापित हैं।

मैंने इन वस्तुओं के प्रसंस्करण में इस कदम को छोटा करने के लिए एक त्वरित बैश फ़ंक्शन लिखा।

function rdep() { apt-cache rdepends $1 | tail -n +3 | sed -e 's/^ //' -e '/^ /d' | cut -d':' -f1 | sort -u; }

उसके बाद मैंने अपनी फ़ाइल से प्रत्येक पंक्ति customको इस फ़ंक्शन में पास किया xargs

echo "$(for i in $(cat custom) ; do rdep $i ; done)" | sort -u > deps

एक बार जब मेरे पास हर संभव निर्भरता की लंबी सूची थी, (हर संभव कथन पर निश्चित नहीं), तो मुझे एक बार फिर वो पंक्तियाँ मिलीं जो एक फ़ाइल के लिए अद्वितीय थीं।

comm -23 custom deps > manual

और पैकेज की मेरी तैयार सूची अब एक फ़ाइल में manualउपलब्ध है जिसका नाम समीक्षा के लिए मेरे पास उपलब्ध है।


0

कोई व्यक्ति https://unix.stackexchange.com/questions/3595/ubuntu-list-explicitly-installed-packages/3624#3624 से जुड़ा हुआ है, जिसके पास एक अच्छा समाधान है, लेकिन, यह सही ढंग से व्यवहार नहीं करता है जैसे कि योग्यता से उत्पादन। बदल गया है। 12.04 LTS की तुलना में वर्तमान में स्थापित पैकेजों की तुलना में यहां एक अपडेटेड संस्करण है। आपको aptitudeस्थापित करने की आवश्यकता होगी , यही एकमात्र आवश्यकता है।

aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' > currentlyinstalled && wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest | cut -f 1 | sort -u > defaultinstalled && comm -23 currentlyinstalled defaultinstalled

ऊपर दिए गए कमांड को भागों में तोड़ने के लिए, यह बिट सिस्टम पर स्थापित हर चीज़ के प्रति एक पैकेज को आउटपुट करता है

aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' > currentlyinstalled

और यह डिफ़ॉल्ट पैकेज सूची को डाउनलोड करता है और अनावश्यक जानकारी देता है।

wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest | cut -f 1 | sort -u > defaultinstalled

और commदो फाइलों की तुलना करता है और डिफ़ॉल्ट सूची में आने वाले पैकेजों को आउटपुट करता है।

comm -23 currentlyinstalled defaultinstalled

आप दूसरी साइट पर भी जा सकते हैं और वहां उत्तर को अपडेट कर सकते हैं।
मार्टिन यूडिंग

0

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

https://gist.github.com/darrenleeweber/8cc570ff402f19af7fa4

#!/bin/bash

manifest_url='http://releases.ubuntu.com/releases/trusty/ubuntu-14.04.3-desktop-amd64.manifest'
manifest_file=$(echo $manifest_url | sed -e 's#.*/##g')
if [ ! -e $manifest_file ]; then
    wget -q $manifest_url
fi
cat $manifest_file | cut -f1 | sort -u > default_installed.txt

aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currently_installed.txt

comm -23 currently_installed.txt default_installed.txt > manually_installed.txt

# sort the 'mannually_installed.txt' packages by architecture and section
mkdir -p package_files
while read p; do
    apt-cache show $p > info.txt
    arch=$(grep -m1 'Architecture: ' info.txt | sed -e 's/Architecture: //')
    section=$(grep -m1 'Section: ' info.txt | sed -e 's/Section: //' -e 's/\//_/g')
    file="${arch}_${section}_packages.txt"
    echo $p >> "package_files/$file"
done <manually_installed.txt

rm info.txt

पैकेज फ़ाइलों को संशोधित करना आसान होगा, इसलिए प्रत्येक पंक्ति के साथ उपसर्ग किया जाता है apt-get install -y और फ़ाइल एक बैश स्क्रिप्ट होती है। तब सभी पैकेज फ़ाइलों को एक योनि प्रावधान लूप में शामिल किया जा सकता है।
डैरेन वेबर

0
#! /bin/sh
DEFAULT=`tempfile`
CURRENT=`tempfile`
cat /var/log/installer/initial-status.gz | gzip -d | grep '^Package:' | awk '{ print $2}' | sort -u > $DEFAULT
aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' | awk '{ print $1}' > $CURRENT
comm -23 $CURRENT $DEFAULT
rm $DEFAULT
rm $CURRENT

0

मुझे वह नहीं मिला जो मेरे लिए उपयुक्त था, इसलिए मैंने एक स्क्रिप्ट लिखी। /Var/log/apt/history.log* और / var / log / aptitude की सामग्री का विश्लेषण करके, फिर डेटाटाइम द्वारा सॉर्ट करें, जिसके परिणामस्वरूप दो सूचियाँ होती हैं, एक को मैन्युअल रूप से pkgs स्थापित किया जाता है, दूसरा स्थापित होता है लेकिन हटाए गए pkgs। 'उपयुक्त सूची' सत्यापन के साथ स्क्रिप्ट। थोड़ा विचलन, क्योंकि dpkg का उपयोग स्थापित और संशोधित PPA स्रोत।

मैंने यहाँ, https://github.com/eexpress/eexp-bin/blob/master/self-installed-pkg.pl डाला ।

अगर किसी को इसके परीक्षण की आवश्यकता है, तो शायद कुछ कोड को संशोधित करने की आवश्यकता है, क्योंकि मेरी लॉग फाइलें चीनी और अंग्रेजी (विशेष रूप से RFC2822 डेटाटाइम प्रारूप) में मिश्रित हैं, मुझे इससे निपटने की आवश्यकता है। यहाँ छवि विवरण दर्ज करें


वह अपठनीय दीवार-की-पाठ स्क्रीनशॉट क्या है?
मुरु

यह मेरी स्क्रिप्ट आउटपुट है। लेकिन आज मुझे फेडोरा से dnf अधिक प्रभावी रूप से मिल रहा है। "dnf इतिहास" संकुल संचालन का शुद्ध इतिहास दिखाता है।
यूटोपिक एक्‍सप्रेस

0

मुझे लगता है कि आप /var/log/apt/history.logऔर उसके दोस्तों को उन परिवर्तनों को देना चाहते हैं जो किए गए हैं:

zcat /var/log/apt/history.log.*.gz | cat - /var/log/apt/history.log | grep -Po '^Commandline: apt(?:-get)? install (?!.*--reinstall)\K.*'

( स्रोत से संशोधित )

आपको वे सभी पैकेज देगा जो कमांड लाइन पर स्थापित किए गए हैं apt-get install

यह पुराने history.logs में ज़िपित फ़ाइलें प्राप्त करता है history.logऔर उन्हें वर्तमान के साथ जोड़ता है और grep से होकर गुजरता है, apt [-get] के साथ लाइनें निकालता है [और / या फिर से इंस्टॉल करें] और बाकी की लाइन (-o ध्वज) को दिखाता है जिसमें मात्रा होती है पैकेज का नाम (s)।

sedयदि आपको अलग-अलग लाइनों पर पैकेज के नाम चाहिए तो इसके लिए थोड़े से मोडिंग (जैसे के साथ ) की आवश्यकता होगी ; पाठक के लिए एक व्यायाम!

यह ध्यान देने योग्य है कि "स्टेटस" सेक्शन में सिनैप्टिक पैकेज मैनेजर ( gksu synapticया kdesudo synaptic) में "इंस्टॉल (मैन्युअल)" लिस्ट है। यदि आप हटाने के लिए पूरी सूची को चिह्नित करते हैं [इसे लागू न करें !!] तो आपको चिह्नित परिवर्तनों को सहेजने और पैकेजों की एक सूची प्राप्त करने में सक्षम होना चाहिए। सावधानी: यह synapticमेरे लिए बंद है (निर्भरता हटाने की गणना संभवतः)।


मेरे जवाब से कहीं और कॉपी किया गया।
pbhj
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.