Elle kurulan paketlerin listesini oluşturma ve paketleri tek tek sorgulama


183

Elle yüklenen paketlerin bir listesini aptveya aptitudebu foobarpaketin elle mi yoksa otomatik olarak yüklenip yüklenmediğini öğrenmek istiyorum . Bunu komut satırından yapmanın düzgün bir yolu var mı?


Stok paketlerini filtreleyen bir çözüm için unix.stackexchange.com adresindeki bu cevaba bakın .
Dirk Bergstrom

Muhtemel kopya? - askubuntu.com/questions/365
jrg


Varsayılan olarak kurulan paketleri hariç tutan gerçekten iyi bir çözüm: Ubuntu açıkça kurulmuş paketleri listeler
pcworld

Cevapların yorumlarına dikkat edin. İnsanlar daha fazla paketin ortaya çıktığını söylemiyorlar, ancak bir el kitabından yüklenen bağımlılık paketlerinin olduğunu unutuyorlar.
Andre Figueiredo

Yanıtlar:


206

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

Kullanarak apt-mark:

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

Kullanarak 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)

Bunları şüpheli rağmen çok az paketler hala çatlaklardan düşme vardır aslında kullanıcı tarafından yüklenmiş, ya doğru dil lokalizasyonu kurulum sayesinde kurulumdan sonra veya totem codec'i yükleyici üzerinden örneğin. Ayrıca, linux başlık sürümleri de, yalnızca sürüme özgü olmayan bir meta paketi yüklememe rağmen, birikmiş görünüyor. Örnekler:

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

O nasıl çalışır:

  1. Elle kurulmuş paketlerin listesini alın. Yetenek için, ek sed, sıranın sonunda kalan boşlukları çıkarır.
  2. Yeni bir kurulumdan hemen sonra kurulan paketlerin listesini alın.
  3. Dosyaları karşılaştırın, yalnızca dosya 1'de olmayan ve dosya 2'de bulunmayan satırları verin.

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

  • Kullanılması ubuntu-14.04-desktop-amd64.manifestdosya ( burada yerine Ubuntu 14.04 için) /var/log/installer/initial-status.gz. Daha fazla paket, olmasalar bile el ile yüklenmiş olarak gösterilir.
  • Kullanılması apt-mark showautoyerine /var/log/installer/initial-status.gz. apt-markdiğer dosya ise, örneğin xserver-xorg paketini içermez.

Diğer çeşitli StackExchange gönderilerini referans olarak kullandım, ancak hiçbiri yukarıdaki çözümden başka işe yaramadı:

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

EDIT: Bir önceki sürümden yükseltme yaptıysanız, yapmanız gerekenler:

Ubuntu'yu bir sürümden diğerine yükselttiyseniz, muhtemelen bu işlemi ayarlamanız gerekecektir. Bu durumda, geçerli sürümdeki initial-status.gz dosyasına ek olarak yeni sürümün açık dosyasını (yukarıya bakın) kontrol ederim. Bunu başka bir karşılaştırma ekleyerek kolayca yapabilirsiniz. Yalnızca bildirim dosyasını kullanmak işe yaramaz, çünkü bildirim dosyası ne yazık ki initial_status.gz dosyasının yaptığı her şeyi içermiyor (kontrol ettim).


7
Bu benim için işe yaramadı çünkü /var/log/installer/initial-status.gzeksik. Bu işaretlenmesi apts bağlı olup olmadığını da öğrenmek istiyorum manualya da değil?
Anwar

1
Ne yazık ki sunucu sürümleri için herhangi bir bildirim yok.
Antti Haapala

showmanualKomutu çalıştırdım (aşağıda). Ve commiki (sıralanmış) listeyi karşılaştırmak için kullanın . showmanualSonuç bana 1840 verdi daha benzersiz paketler apt-mark showmanualbu yöntemle gösterilmeyen. NO paketleri bu commkomutun çıktısına özgüdür. Bilgisayarım için 894 paketin her iki sonuçta da listelendiğini kaydetmenin daha ilginç olduğunu düşünüyorum . Neden böyle büyük bir tutarsızlık olduğundan emin değilim. Bazı (birçok?) Paketlerin sürümleri belirli görünüyor. XOrg, GTK bileşenleri ve diğerleri gibi diğerleri lib*güncellemeler olabilir. Neyse, bu cevap çok iyi bir başlangıç.
irade

Sadece çözümlerini karşılaştırdım apt-mark showmanual. Kaç farkın görülebilir olduğu ilginç. listenizde 238 paket varken showmanual 1717 paket döndürür. Kurulan 2179 paketin her ikisinde de sadece 223 adet, 15 tanesi sadece sizde (örnekler: nodejs, lightdm) ve 223'ü sadece showmanual (örnekler: xserver-xorg, ubuntu-desktop) içinde bulunuyor. Listeniz daha faydalı gibi geliyor, ancak bu farklılıkların nereden geldiğini bilmeden karar vermek kolay değil ... (ama nginx ve lightdm'i elle yüklediğimden eminim ...) [üzgünüm az önce yazacağım. aynı;)]
Daniel Alder

64

Apt paketinin daha yeni sürümlerinde, apt-mark komutu da vardır

apt-mark showmanual

35
Bu, el ile yüklediğimden çok daha fazla paket gösteriyor.
Umang

1
@Umang Haklısın. Bu cevabı yazdığımda bunun böyle olmadığını söyleyebilirim. Sistemimde dikkate almak için hiçbir sebep yoklinux-image-3.11.0-*-generic vb
Daniel Alder

1
@Umang belki bu size askubuntu.com/questions/432743/… adresinde yardımcı olacaktır , ancak cevap kabul edilmedi. Gerçek şu ki, yeni bir kurulumun birçok paketi zaten manuel olarak işaretlenmiş durumda. Fakat hala bazı tuhaf şeyler var. Benim örneğimde kalmak için: linux-image-3.13.0-24-genericmanuel fakat akım linux-image-3.13.0-27-genericotomatik. Referans paketinin yükseltilmesi (bu durumda linux-image-generic, bağımlılıkları değiştiren), manuel işaretin otomatik olarak ayarlandığı anlaşılıyor.
Daniel Alder

5
@DanielAlder yeni kurulumun bazı paketleri manuel olarak işaretlenmelidir. Manuel olarak işaretlenmiş paket yoksa, tüm sistem ile silinebilir apt-get autoremove. Bu kesinlikle istediğin şey değil.
Anton K

2
"El ile kurulmuş", "ilk işletim sistemi kurulumundan sonra kullanıcı tarafından yüklenmiş" anlamına gelirse, bu doğru bir cevap değildir.
Seamus

21

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

Örneğin:

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

Mükemmel değil, fakat elle kurduğum şeyi netleştirmek konusunda oldukça iyi. -B 1Ne zaman kurulduğunu görmek için bir kenara 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

Bu alır eğer emin değilim aptitude ya da değilim. Ubuntu Software masaüstü uygulamasından yüklemeleri almak görünmüyor.


1
Yıllar boyunca verilen tüm cevaplardan, 18.04 sunucusunda bile yaklaşan tek cevap bu.
Quentin Skousen

20

apt-mark showauto | grep -iE '^foobar$' Paket otomatik olarak kurulduysa "foobar" çıktısını alacak, aksi halde hiçbir şey.

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


aptitude searchTÜM paketleri elle yüklenir sadece olanları gösterir (O OP istediğini varsayıyorum)
Oli

1
@Oli: yetenek arama modellerine bakın; Orada kullanıyorum desen tam olarak OP istediğini yapmalı.
Li Lo,

Ben koştum onu. Yüklenmemiş bir paket yükü gösterir.
Oli

7
Bir şey doğru değil, kullanıyorum aptitude search '!~M ~i've 1043 paket listeliyor. Bu kadar çok paketi el ile yüklememe imkân yok.
ThatGraemeGuy

Bu kesinlikle istendiği gibi çalışmaz, önceden kurulmuş paketleri de yazdırır.
Irfy

9

Aşağıdaki komut dosyası, otomatik yüklemeye ayarlanmamış tüm paketleri yazdırır ve bu nedenle manuel olarak yüklenir:

#!/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-işaretinin otomatik olarak kurulmuş paketleri nasıl bastırdığını temel alır.


Size teşekkür ederim efendim. Bu aslında kabul edilen cevabın aksine çalışır.
Irfy

benim için sadece birkaç paket göster --- kesinlikle çoğunu kaçır.
Rmano

Aynısı, kesinlikle yüklediğim paketleri elimden aldıktan hemen sonra.
David Ljung Madison

sys.exit(1)Olmadan kullanmak import sys, python'un daha yeni sürümlerinde bir hataya neden olabilir. Ya import syskullanın exit(1).
Videonut

7

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

apt list [option]

Bunun için yararlı olabilecek seçenekler şunlardır:

--installed sadece sistemde kurulu olan paketleri görüntülemek için (yaklaşık 50.000'den fazla)

--manual-installedpaketlere listelemek için açıkça bir komutla, ya doğrudan ya da bağımlılıklar olarak yüklenir.

Alternatif olarak, şunları yapabilirsiniz:

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


5

Birkaç kişinin yorumunda olduğu gibi, apt-mark showmanual biraz rahatsız edici görünüyor (ve ben bunu 727799 numaralı hata olarak bildirdim ). Kullandığımda, aslında / var / lib / apt / Extended_states'e (bunun depolanması gereken yerlerde) giriş yapmamış bile olan bir çok şeyi rapor ediyor ve apt-get, yüklü olduğu şeyleri günlüğe kaydetmiyor / var / lib / apt / Extended_states (sadece / var / lib / dpkg / status içinde). Yukarıdaki txwikinger tarafından yazılan python betiği doğrudan / var / lib / apt / Extended_states 'ten çizer ancak bugün kullanıyorsanız sözdizimi çalışmayabilir (benimki Kubuntu 13.10 ile hata üretmeye başladı). Güncelleme sözdizimi:

#!/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ünmüyor 5 öğelerin çok kısa bir listesi oldu.


1
sys.exit(1)Olmadan kullanmak import sys, python'un daha yeni sürümlerinde bir hataya neden olabilir. Ya import syskullanın exit(1).
Videonut

4

Bir GUI çözümü vermek istiyorum.

görüntü tanımını buraya girin

  1. Açık Synaptic Package Manager

  2. Git Status

  3. Click Installed (manual)

Elle kurulan paketlerin listesini apt veya yetenek ile verir.

Ne yazık ki Custom Filtersbir olup olmadığını bulmak için herhangi bir seçenek bulamadıfoobar paketin elle mi yoksa otomatik olarak yüklenip yüklenmediğini .

Paket altında Installedancak altında değilse Installed (manual)otomatik olarak yüklenmiştir. Paket altında Installed (manual)ise el ile kuruldu.


2

Hiç kimse size apr-something komutunu kullanarak iyi bir cevap vermezse, zor yoldan yapabilirsiniz . Apt-get, bilgilerini / var / lib / apt / Extended_states konumunda saklar. Otomatik olarak yüklenen herhangi bir dosya bu dosyaya eklenecektir. Zaten bu dosyaya bir paket yüklerseniz, paket bu dosyada kalır, ancak ikinci satırda Otomatik yüklü: 0. Silinmedi.

Not: Beklendiği gibi, dosya yerleştirme değişiklikleri göründüğünde çalışması muhtemel olan daha iyi cevaplar. Sadece dosya yerindeki bilginin yararlı olması durumunda benimkini tutuyorum.


1
Hayır. Liferea'nın otomatik yüklü olarak işaretlendiğini bulmak için o dosyaya hızlıca baktım. Yaptım apt-get install lifereave kurmadı ama "elle yüklendi" olarak işaretlenmiş bir etkiye sahip çıktı. Şimdi liferea hala dosyada, bir sonraki satırın 0yerine bir 1. Ayrıca, regex şablonunuzu tam " foobar$"yerine değiştirmelisiniz foobar.
Umang

Bu doğru. Benim hatam, sistemimde 0 ile satır yok, fakat bu nadir bir durum olmalı. Cevabı sadece durumda güncellerim.
Javier Rivera

2

Çok googling yaptıktan sonra bu senaryoyu birleştirmeyi başardım. Benim için iyi çalışır:

# 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

Sen kullanabilirsiniz sort -uyerine sort | unique. As apt-markmimarisini göstermez, set operasyonları öncesi en dpkg çıktı ayrılmasına (veya kullanmalıdır dpkg-query -W -f='${Package}\n'). Ayrıca, dpkg şu anda yüklü olmayan bazı paketleri listeleyebilir. "Azaya" gelince, `dpkg-query -W -f = '# $ {binary: Summary} \ n' $ pack kullanabilirsiniz, bu daha hızlıdır.
jarno

Oh, apt-markbazı paketler için mimariyi gösterebilir, ancak birçokları için görüntülemeyebilir dpkg -l.
jarno

apt-cache searchyavaş. Help.ubuntu.com/community/ListInstalledPackagesByDate gibi bir şey kullanarak yüklü tarihlerin listesini önceden almak daha verimli olabilir
opticyclic

1

Li Lo dediği gibi, apt-mark showautootomatik olarak yüklü şeylerin şişman bir listesini almalıyım.

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

Not: Bu, tüm arkadaşlarınıza muazzam bash komutları patlattığınızda ne kadar havalı göründüğünün bir örneğidir.

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

Okunabilmesi için iki satır üzerine kırdım. Bu ne işe yarıyor?

  • İlk önce dpkg'yi kurulu paketlerin listesi için sorgularız.
  • Bunları gerçekte yüklü olanlar için filtreliyoruz (yalnızca kalıntı config)
  • Statüyü kestik
  • Bu listeyi, otomatik liste ile karşılaştırıyoruz. apt-mark
  • Sallanıyoruz çünkü yapabiliriz.

Sık sık dpkg yüklü olmayan paketleri gösterir çünkü bu, doğru şüphe
txwikinger

Ne demek istediğini biliyorum ama bash-fu'm yeterince güçlü değil. Durumu dpkg-query komutundan gösterebileceğinizi, aşağı doğru sürdüğünüzü ve durumu kesebileceğinizi biliyorum. Ben gidiyorum.
Oli

comm -3 <(dpkg -l | grep '^ii' | cut -d \ -f 3|sort) <(apt-mark showauto|sort)daha iyi;)
LassePoulsen

-1

Bu, manuel olarak kurulan tüm paketleri listeleyecektir: bağımlılıklar, kaldırılmış 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.* $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
}
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.