El ile kurulmuş paketler nasıl bulunur?


48

Bilgisayarıma düz bir Ubuntu 10.10 yükledim ve apt-get aracılığıyla bazı yazılımlar yükledim. Geçen hafta her şeyi kırmayı başardım ve sıfırdan başladım ve yazılımımı yeniden yüklemem gerekiyor. Manuel olarak yüklediğim tüm paketlerin bir listesini oluşturmanın bir yolu var mı?

Böylece bana bir liste verecek texlive, ...ve olmasın texlive, texlive-dep1, textlive-dep2, ...ve tüm standart paketler kaldırılsın mı?

Bir şekilde normal kurulumdan hangi programları kaldırdığımı çözebilseydim, bu da harika olurdu!


2015-05-23 Güncellemesi: Artık sistemimde yapılandırma yönetimi olarak Ansible kullanıyorum. Orada yüklenecek paketleri belirtiyorum. Bu, tüm programları yeni bir sisteme yüklemek, hatta daha iyi bir amaca hizmet eder. Bu nedenle, bu soru bazı hafif yapılandırma yönetimine giriş olabilir.

Yanıtlar:


24

Bu öneriyle eski kurulumunuzun hala önyükleneceğini varsayıyorum!

Bir paket kümesini başka bir makinede çoğaltmak için:

Sistem A'da, şunu çalıştırın:

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

my-selectionsDosyayı Sistem B'ye taşıyın .

B Sisteminde şu komutu çalıştırın:

dpkg --set-selections < my-selections

ve sonra:

sudo apt-get dselect-upgrade

Önemli not: Standart olmayan depolardan ve / veya PPA'lardan paketler kurduysanız , yükseltmeyi çalıştırmadan önce Sistem A'dan Sistem B'ye kopyalamak /etc/apt/sources.listve içeriğini de isteyeceksiniz /etc/apt/sources.list.d/.

dpkgNeyi kaldırdığınızı görmek için de kullanabilirsiniz (Not: bu ayrıca el ile yüklediğiniz ve kaldırdığınız paketleri de içerir ):

dpkg --get-selections | grep deinstall

Sonuçlarınızı terminalde görebilir veya elbette bir dosyaya yönlendirebilirsiniz.


9
Tüm paketlerin bir listesini almak istiyorum, ancak yalnızca açıkça yüklediğim paketlerin adlarına sahip olmak istiyorum. Yani sadece somethingve de değil something-common.
Martin Ueding,

6
Evet bu faydalı olsa da, soruyu soranı yapmaz.
Timmmm

3
Bunu yaparsanız, programları kaldırdığınızda otomatik olarak yüklenmiş bağımlılıklar hiçbir zaman temizlenmez. Neden insanlar, sorucunun özellikle istemediğini söylediği bir cevabı neden oy kullanıyor?
jbo5112

20

Superuser.com'dan gelen bu konu şu çözümü veriyor:

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

2
Bu benim için çalışmıyor. Sadece yüklü olan ya da kesinlikle açıkça istediğimden daha fazlasını listeler.
Timmmm

Yüklemiş olduğunuz herşeyi apt-getve onların bağımlılıklarını listeler . Örneğin, eğer yüklediyseniz aptitude, o zaman da listelenirapt-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

Apt loglarınız / var / log / apt dizinindeyse, bunun gibi bir şey çalışmalıdır:

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

Veya çıktıdaki bazı tekrarlayan önemsizlerden kurtulmak istiyorsanız:

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

6

Apt-mark kullanabilirsiniz , ancak debfoster'i öneririm :

sudo apt-get install debfoster
sudo debfoster

Bu, kurulu tüm paketleri denetleyecek ve hangilerini diğerlerini kurmaya devam edeceklerini bulacaktır:

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:

Her soruya "y" cevabını verdiğinizde (hızlıca hareket etmek için Enter'a basın), debfoster paket listesini toplar ve bunları bir dosyaya satır yazar. Varsayılan olarak bu /var/lib/debfoster/keepers. Bu gibi görünüyor:

gnome-do
texlive-full
...

Ben aracılığıyla debfoster yapılandırmak /etc/debfoster.confde bu listeyi koymak için /etc/debfoster-keepersdosyayı ve takip etckeeper tarihi ve yedeklerini tutmak. Buradaki cevap , yeni satırlarla sınırlandırılmış bir metin dosyasından bir paket listesinin nasıl yükleneceğini gösterir:

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

Burada bir sınırlamaya dikkat edin, boşalttığınız paketlerin önünde '-' var. Yani apt-mark komutunu çağırmadan önce bu satırları kaldırmak istiyorsunuz.

Debfoster'ın web sitesinde debfoster'ın yetenek lehine itiraz edildiğini söylemesine rağmen, debfoster'ın hızlı ve basit yapılandırmasını tercih ediyorum. Sizi paket veritabanınızın ortasına yerleştirir ve otomatik ve manuel paketleri daha belirgin hale getirerek işleri temizlemenizi sağlar .

Seçeneklerinizi açıklamak için debfoster isteminde "h" yazın. "?" Yazın Paket açıklamasını görmek için Burada nasıl yapılır yararlı olabilir.


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

El ile kurulan tüm paketleri verir (sistem paketleri değil, bağımlılıkları değil). Örnekler gösteriyor build-essentialama göstermiyor gcc.


3

Apt- * tools kullanmayı tercih edenler için, manuel / otomatik durumun hem sorgulanmasına hem de değiştirilmesine izin veren apt-mark bir yardımcı program vardır.

apt-mark showmanual

İlgilendiğiniz paketler için desen de belirleyebilirsiniz:

apt-mark showmanual qemu\*

Bu bilet.
John Von Neumann

2

Sonunda şimdi anladım:

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
Sanırım bu sadece bir yetenek kullanarak yalnızca paketleri yüklediyseniz işe yarar. Yine de benzer dosyalar var /var/log/apt/history.log(.N.gz).
Timmmm

Bunun zgrepyerine gunzipveya zcatborulu kullanabilirsiniz grep. Bu, gzip ile birlikte gelen bir sarmalayıcı betiği olduğuna inanıyorum. Ayrıca sıkıştırılmamış dosyalarını kabul, bu yüzden senaryonun basitleştirebiliriszgrep -E '(\[INSTALLIEREN\]|\[INSTALL\])' /var/log/aptitude* | awk '{ print $2 }'
Steve Buzonas

2

Günlük dosyalarını / var / log / apt / dizininde açarak her şeyi alabiliyorum.

Sonra içeri girip apt-get install paketlerini elle filtreliyorum. Bunu programlı yapmanın bir yolu olabilir, ama farkında değilim.


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

Bu şekilde geçmişte gerçekleştirilen komutların listesini görürsünüz.

Daha fazla bilgiye ihtiyacınız olursa grep kodunu kaldırın:

less history.log

kütük sıkıştırılmışsa (yani gz ile bitirin)

gunzip <filename>

bittiğinde tekrar sıkıştırmak için şunları yapabilirsiniz:

gzip <filename>

1
Günlük dosyalarını açmak ve yeniden açmak yerine, neden kullanmıyorsunuz zcat? Bu kadar kolay zcat filename.gz. Sadece gzip ile sıkıştırılmış dosyalar üzerinde kullanabilirsiniz cat. Ayrıca grepdeğiştirilebilir zgrepörn zgrep Commandline history.log.1.gz.
lgarzo

Fikrinize göre bir komut satırı ile geldim: (grep "Commandline" history.log ; zgrep "Commandline" history.log.*.gz ) | grep " install " | grep -v -- "--yes" | sed -r "s/^.*install //". Çıkarılan paketler de listelendiği için kusurları vardır ve bir paket birden fazla kez kurulmuşsa, birkaç kez listelenir.
lgarzo

1

Burada benim için herhangi bir çözüm görmedim, dpkg ile bir kaç tane deb paket paketi kurdum ve özellikle aradığım bazı ürünler eksikti.

Oldukça uzun bir astar, ancak kopyalayıp yapıştırmak için uygun olacaktır:

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

Yukarıdaki komut, mevcut çalışma dizininizdeki bir dosyaya bir paket listesi kaydeder my-packages.

açıklama

Önce, kurulum sırasında seçilen paketlerin taban çizgisini oluşturan bir paket listesi hazırladım.

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

Genel olarak kurulan öğelerin uzun bir listesini izledi.

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

Daha sonra iki dosyayı karşılaştırdım initialve installedyalnızca yüklenen benzersiz öğeleri listeledik.

comm -23 installed initial > custom

Oradan bağımlılıkları filtrelemek istedim, bu, bu yöntemin bazı istenen paketleri kaçırabildiği yer, açık bir şekilde kurulmuş olan bağımlılıkların farkında değil.

Bu öğelerin işlenmesinde bu adımları kısaltmak için hızlı bir bash işlevi yazdım.

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

Bundan sonra her satırı customdosyamdan bu fonksiyona aktardım xargs.

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

Her olası bağımlılığın uzun bir listesini yaptıktan sonra (her olası ifadede emin değilim), bir kez daha tek bir dosya için benzersiz olan satırları aldım.

comm -23 custom deps > manual

Ve bitmiş paket listem şimdi manualincelemem için hazır olan bir dosyada .


0

İyi bir çözüme sahip olan https://unix.stackexchange.com/questions/3595/ubuntu-list-explicitly-installed-packages/3624#3624 ile bağlantılı olan biri; değişti. 12.04 LTS'ye kıyasla şu anda yüklü paketlerin karşılaştırmasına dayanan güncellenmiş bir sürüm. Yüklemeniz gerekecek aptitude, tek şart bu.

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

Yukarıdaki komutu parçalara ayırmak için, bu bit sistemde kurulu her satırın bir paketini çıkarır

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

Bu da varsayılan paket listesini indirir ve gereksiz bilgileri kırpar.

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

ve commiki dosyayı karşılaştırır ve varsayılan listede bulunmayan paketleri çıkarır.

comm -23 currentlyinstalled defaultinstalled

Ayrıca diğer siteye gidebilir ve cevabı burada güncelleyebilirsiniz.
Martin Ueding

0

Temel paket kümesi olarak bir dağıtım bildirim dosyası kullanın. Elle yüklenen sonuçları mimari ve bölümlere göre paket gruplarına ayırın, böylece paket gruplarına odaklanmak daha kolay (belki bazı bölümleri umursamıyorsunuz).

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

Paket dosyalarını değiştirmek, her satırın önüne eklenmesi apt-get install -y ve dosyanın bir bash betiği olması kolay olacaktır . Sonra tüm paket dosyaları bir serseri sağlama döngüsüne dahil edilebilir.
Darren Weber

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

Benim için uygun bir tane bulamadım, bu yüzden bir senaryo yazdım. /Var/log/apt/history.log* ve / var / log / aptitude içeriğini analiz ederek, sonra tarihine göre sıralayın, iki listeyle sonuçlanır, biri elle yüklenen pkgs, diğeri yüklenip kaldırılan pkgs. 'Apt list' doğrulaması olan script. biraz sapma, çünkü dpkg kullanımı kurulu ve PPA kaynağı değiştirilmiş.

Buraya koydum, https://github.com/eexpress/eexp-bin/blob/master/self-installed-pkg.pl .

Herkesin test etmesi gerekiyorsa, bazı kodları değiştirmeniz gerekebilir, çünkü günlük dosyalarım Çince ve İngilizce olarak (özellikle RFC2822 datetime biçiminde) karıştırılır, onunla ilgilenmem gerekir. görüntü tanımını buraya girin


Bu okunamayan metin duvarı ekran görüntüsü nedir?
muru

Bu benim senaryo çıktım. Ama bugün Fedora’nın dnf’ini daha etkili buluyorum. "dnf history", paket işlemlerinin saf bir geçmişini gösterir.
ütopik,

0

Yaptığınız değişiklikleri yapmak için kullanmak istediğinizi /var/log/apt/history.logve arkadaşlarınızı düşünüyorum :

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

( Kaynaktan değiştirildi )

Komut satırında kurulmuş olan tüm paketleri bir varyasyon kullanarak verecektir apt-get install.

Eski dosyalardaki sıkıştırılmış dosyaları history.logakımla ekler history.logve grep'ten geçer, apt [-get] install [ve / veya restore] ile satırları ayıklar ve satırın kalanını (-o bayrağı) tutarını gösterir paket adı.

sedSadece paket isimlerini ayrı satırlara koymak istiyorsanız , bunun için biraz modlamaya ihtiyaç duyacaksınız. okuyucu için bir egzersiz!

"Durum" bölümündeki sinaptik paket yöneticisinde ( gksu synapticveya kdesudo synaptic) "yüklü (el ile)" bir liste bulunduğunu belirtmekte fayda var . Tüm listeyi kaldırılmak üzere işaretlerseniz [uygulamayın !!] işaretli değişiklikleri kaydedebilmeli ve bu şekilde paketlerin bir listesini alabilmelisiniz. Dikkat: Bu synapticbenim için kilitlendi (bağımlılığın ortadan kaldırılmasının muhtemelen hesaplanması).


Kopyalanan Cevabıma başka yerde.
pbhj
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.