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ı?
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ı?
Yanıtlar:
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:
sed, sıranın sonunda kalan boşlukları çıkarır.Diğer olasılıklar da işe yaramaz:
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.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).
/var/log/installer/initial-status.gzeksik. Bu işaretlenmesi apts bağlı olup olmadığını da öğrenmek istiyorum manualya da değil?
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ıç.
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ı;)]
Apt paketinin daha yeni sürümlerinde, apt-mark komutu da vardır
apt-mark showmanual
linux-image-3.11.0-*-generic vb
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.
apt-get autoremove. Bu kesinlikle istediğin şey değil.
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.
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)
aptitude search '!~M ~i've 1043 paket listeliyor. Bu kadar çok paketi el ile yüklememe imkân yok.
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.
sys.exit(1)Olmadan kullanmak import sys, python'un daha yeni sürümlerinde bir hataya neden olabilir. Ya import syskullanın exit(1).
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
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.
sys.exit(1)Olmadan kullanmak import sys, python'un daha yeni sürümlerinde bir hataya neden olabilir. Ya import syskullanın exit(1).
Bir GUI çözümü vermek istiyorum.
Açık Synaptic Package Manager
Git Status
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.
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.
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.
Ç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
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.
apt-markbazı paketler için mimariyi gösterebilir, ancak birçokları için görüntülemeyebilir dpkg -l.
apt-cache searchyavaş. Help.ubuntu.com/community/ListInstalledPackagesByDate gibi bir şey kullanarak yüklü tarihlerin listesini önceden almak daha verimli olabilir
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?
apt-markcomm -3 <(dpkg -l | grep '^ii' | cut -d \ -f 3|sort) <(apt-mark showauto|sort)daha iyi;)
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
}