Manuel olarak kurulan paketlerin listesi oluşturma ve tek tek paketleri sorgulama

145

apt veya aptitude tarafından manuel olarak yüklenen paketlerin bir listesini almak ve foobar paketinin elle veya otomatik olarak yüklenip yüklenmediğini öğrenmek istiyorum. Bunu komut satırından yapmanın temiz bir yolu var mı?

    
sordu Umang 16.08.2010 19:07

12 cevap

165

Bu iki linerdan birini kullanabilirsiniz. Her ikisi de makinemde aynı çıktıyı veriyor ve bu soruya kadar (6 Temmuz 2014) önerilen tüm çözümlerden daha kesin.

apt-mark kullanma:

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

aptitude kullanma:

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)

Çok az sayıda paket hala çatlaklardan geçiyor, ancak bunların, kurulumdan hemen sonra dil yerelleştirme kurulumu veya e-posta yoluyla kullanıcı tarafından yüklenen olduklarından şüpheleniyorum. Totem codec yükleyici aracılığıyla. Ayrıca, linux-header sürümleri de, sadece sürüm olmayan metapackage kurdum bile, birikir gibi görünüyor. Örnekler:

libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29    

Nasıl çalışır?

  1. El ile kurulan paketlerin listesini alın. Yetenek için, ek sed , satırın sonunda kalan boşlukları çıkarır.
  2. Yeni bir yüklemeden hemen sonra yüklenen paketlerin listesini alın.
  3. Dosyaları karşılaştırın, yalnızca dosya 1'de bulunmayan ve dosya 2'de bulunmayan satırları çıkarın.

Diğer olasılıklar da işe yaramıyor:

  • Bunun yerine ubuntu-14.04-desktop-amd64.manifest dosyasının kullanılması (bunun yerine Ubuntu 14.04 için burada ) /var/log/installer/initial-status.gz . Daha fazla paket, olmasa bile manuel olarak yüklenir.
  • apt-mark showauto yerine /var/log/installer/initial-status.gz kullanılıyor. Örneğin, apt-mark xserver-xorg paketini içermezken, diğer dosyada bulunur.

Diğer StackExchange yayınlarını referans olarak kullandım, ancak hiçbiri yukarıdaki çözümün yanı sıra çalışmaz:

Her ikisi de yukarıdaki çözümden daha fazla paket gösterir.

EDIT: Bir önceki sürümden yükselttiyseniz ne yapmalısınız?

Ubuntu’yu bir sürümden diğerine yükselttiyseniz, muhtemelen bu işlemi ayarlamanız gerekecektir. Bu durumda, mevcut sürümden ilk status.gz dosyasına ek olarak yeni sürümün manifest dosyasını kontrol ederim (yukarıya bakın). Bunu başka bir karşılaştırma yaparak kolayca yapabilirsiniz. Sadece manifest dosyasının kullanılması işe yaramaz, çünkü açık dosya, initial_status.gz dosyasının yaptığı her şeyi içermez (kontrol ettim).

    
verilen cevap jmiserez 06.07.2014 17:01
53

Paketin daha yeni sürümlerinde, apt-işareti komutu da vardır

apt-mark showmanual
    
verilen cevap Daniel Alder 17.05.2012 18:21
19
Paket otomatik olarak yüklendiyse

apt-mark showauto | grep -iE '^foobar$' "foobar" değerini verir, aksi halde başka bir şey yoktur.

aptitude search '!~M ~i' , otomatik olarak yüklenmeyen paketleri listeleyecektir. Yazık bir yetenek, Ubuntu Desktop’da 10.10’dan başlayarak varsayılan kurulumun bir parçası olmayacak.

    
verilen cevap Li Lo 16.08.2010 19:32
11

Ubuntu 16.04 için günlük dosyasına /var/log/apt/history.log göz atın.

Örneğin:

zgrep 'Commandline: apt' /var/log/apt/history.log /var/log/apt/history.log.*.gz

Mükemmel değil, ama el ile ne yüklediğimi tam olarak açıklamakta oldukça iyi. Yüklendiğini görmek için grep'e -B 1 koyun.

Örnek çıktı

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

Bunun, aptitude 'sini alıp almadığından emin değil. Ubuntu Software masaüstü uygulamasından yüklemeleri almıyor gibi görünüyor.

    
verilen cevap s1037989 04.02.2017 19:48
8

Aşağıdaki komut dosyası, otomatik yüklemeye ayarlanmamış tüm paketleri basacak ve manuel olarak yüklenecektir:

#!/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'in otomatik olarak yüklenen paketleri nasıl yazdırdığını temel alır.

    
verilen cevap txwikinger 16.08.2010 21:42
5

Birkaç kişinin yorumladığı gibi, apt-mark showmanual biraz buggy gibi görünüyor (ve ben 727799 hatası . Bunu kullandığımda, aslında / var / lib / apt / extended_states içinde saklanmayan bir çok şeyi (burada depolanması gereken) bildirir ve apt-get, kurulu olduğu gibi bir şeyleri günlüğe kaydetmez. / var / lib / apt / extended_states (sadece / var / lib / dpkg / durumunda). Txwikinger tarafından yapılan python betiği, doğrudan / var / lib / apt / extended_states'den derlenmiştir, ancak bugün kullandığınız sözdizimi çalışmayabilir (sadece Kubuntu 13.10 ile hata oluşturmaya başladı). Güncellenen sözdizimi şöyledir:

#!/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))

Benim için bu da doğru görünmeyen 5 öğeden oluşan kısa bir listeydi.

    
verilen cevap cluelesscoder 27.10.2013 01:28
4

Tüm paketlerin bir listesini (yüklenmemiş, kullanıcı tarafından yüklenmemiş veya varsayılan olarak tüm PPA'lara yüklenmemiş) almak için, apt aşağıdaki yöntemi kullanır:

apt list [option]

Bunun için kullanılabilecek olası seçenekler şunlardır:

Yalnızca sistemde yüklü olan paketleri (yaklaşık 50.000 + üzeri) görüntülemek için --installed

Doğrudan veya bağımlı olarak bir komut tarafından açıkça yüklenen paketleri listelemek için --manual-installed

.

Alternatif olarak şunları yapabilirsiniz:

Kullanıcı komutları ve bağımlılıklarından kaynaklanan paketlerin listesini almak ve desteklenen sürüm ve mimari (x86, x86_64, amd64, tümü, vb.) hakkında ek bilgi almak için apt list --manual-installed | grep -F \[installed\]

    
verilen cevap Aalok 07.02.2017 15:01
1

Li Lo'nun dediği gibi, apt-mark showauto size otomatik olarak yüklenen şeylerin yağ listesini almalıdır.

Şimdi elle yüklenen şeyleri göstermek için, yetenek için hoş ve basit bir arama değiştirici var. Ama bunu yapmak istemiyorsun. Bazı roket bilimi yapan devasa bir bash komutu yazmak istiyorsun.

Not: Bu, tüm arkadaşlarınıza devasa bash komutlarını nasıl havalı tutacağınızı gösteren bir örnek niteliğindedir.

comm -3  <(dpkg-query --show -f '${Package} ${Status}\n' | \n
grep "install ok installed" | cut --delimiter=' ' -f 1) <(apt-mark showauto)

Okunabilirlik için iki satıra ayırdım. Bu ne yapar?

  • İlk olarak, yüklenen paketlerin bir listesi için dpkg'yi sorgularız.
  • Gerçekte yüklü olanları filtreliyoruz (sadece kalıntı yapılandırma değil)
  • Durumu seçiyoruz
  • Bu listeyi otomatik listeden apt-mark ile karşılaştırıyoruz
  • Çıkıyoruz çünkü yapabiliriz.
verilen cevap Oli 16.08.2010 19:41
1

Hiç kimse size apr-şey komutu kullanarak hoş bir cevap vermezse, bunu zor yoldan yapabilirsiniz. Apt-get, / var / lib / apt / extended_states içindeki bilgilerini depolar. Bu dosyaya otomatik olarak yüklenen herhangi bir dosya eklenecektir. Bu dosyada zaten bulunan bir paketi elle yüklerseniz, paket bu dosyada kalır, ancak Otomatik olarak yüklenir: ikinci satırda 0 olur. Silinmedi.

Not: Dosya yerleşimi değişiklikleri ortaya çıktığında daha iyi yanıt verileceği beklenildiği gibi. Dosya konumundaki bilgilerin yararlı olması durumunda benimkini tutarım.

    
verilen cevap Javier Rivera 16.08.2010 19:44
1

Çok fazla şey yaptıktan sonra bu komut dosyasını bir araya getirmeyi başardım. Benim için iyi çalışıyor:

# List of all packages currently installed
current=$(dpkg -l | awk '{print }' | 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/.* - (.*)//')
    date=$(date -r /var/lib/dpkg/info/$pack.list)

    echo "# $desc"
    echo "# $date"
    echo "sudo apt-get install $pack"
    echo -e ""
done
    
verilen cevap dufferZafar 31.05.2015 22:28
0

GUI çözümü vermek istiyorum.

  1. Synaptic Package Manager 'ı aç

  2. Status

  3. adresine git
  4. Installed (manual)

  5. 'i tıklayın.

Elle veya uygun şekilde manuel olarak yüklenen paketlerin listesini verecektir.

Maalesef Custom Filters paketinin elle mi yoksa otomatik olarak mı yüklendiğini öğrenmek için foobar 'da herhangi bir seçenek bulamadım.

Paketin Installed 'si altında ancak Installed (manual) ' nın altında değilse Otomatik olarak kuruldu. Paket Installed (manual) altındaysa, manuel olarak kuruldu.

    
verilen cevap blueray 28.05.2018 17:39
-1

Bu, manüel olarak yüklü tüm paketleri listeleyecektir: bağımlılıklar, kaldırılan paketler, sistem kurulumu sırasında kurulan paketler.

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.* " |
  sed -r "s/Commandline: apt-get//;s/ //" |
  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
}
    
verilen cevap wieczorek1990 08.10.2014 15:39

Etiketlerdeki diğer soruları oku