Elle yüklenen paketlerin bir listesini apt
veya aptitude
bu foobar
paketin 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 apt
veya aptitude
bu foobar
paketin 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.manifest
dosya ( 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 showauto
yerine /var/log/installer/initial-status.gz
. apt-mark
diğ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.gz
eksik. Bu işaretlenmesi apts bağlı olup olmadığını da öğrenmek istiyorum manual
ya da değil?
showmanual
Komutu çalıştırdım (aşağıda). Ve comm
iki (sıralanmış) listeyi karşılaştırmak için kullanın . showmanual
Sonuç bana 1840 verdi daha benzersiz paketler apt-mark showmanual
bu yöntemle gösterilmeyen. NO paketleri bu comm
komutun çı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-generic
manuel fakat akım linux-image-3.13.0-27-generic
otomatik. 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 1
Ne 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 search
TÜ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 sys
kullanı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ü), apt
aş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-installed
paketlere 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 sys
kullanı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 Filters
bir 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 Installed
ancak 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 liferea
ve kurmadı ama "elle yüklendi" olarak işaretlenmiş bir etkiye sahip çıktı. Şimdi liferea hala dosyada, bir sonraki satırın 0
yerine 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 -u
yerine sort | unique
. As apt-mark
mimarisini 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-mark
bazı paketler için mimariyi gösterebilir, ancak birçokları için görüntülemeyebilir dpkg -l
.
apt-cache search
yavaş. 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 showauto
otomatik 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-mark
comm -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
}