it-swarm.dev

Generování seznamu ručně nainstalovaných balíčků a dotazování na jednotlivé balíčky

Chtěl bych získat seznam balíčků nainstalovaných ručně pomocí apt nebo aptitude a být schopen zjistit, zda byl balíček foobar nainstalován ručně nebo automaticky. Existuje nějaký úhledný způsob, jak to udělat z příkazového řádku?

198
Umang

Můžete použít některou z těchto dvou jednoplášťových linek. Oba přinášejí přesně stejný výkon na mém stroji a jsou přesnější než všechna dosud navrhovaná řešení (6. července 2014) v této otázce.

Pomocí apt-mark:

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

Pomocí 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)

Jen velmi málo balíčků stále propadá trhlinami, ačkoliv mám podezření, že je uživatel skutečně nainstaloval jsou, a to buď hned po instalaci prostřednictvím nastavení lokalizace jazyka, nebo např. prostřednictvím instalátoru kodeků Totem. Také se zdá, že se hromadí i verze linuxových záhlaví, i když jsem nainstaloval pouze metapackage, který není specifický pro verzi. Příklady:

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

Jak to funguje:

  1. Získejte seznam ručně nainstalovaných balíčků. Pro aptitude další sed odstraní zbývající mezeru na konci řádku.
  2. Seznam nainstalovaných balíčků získáte hned po nové instalaci.
  3. Porovnejte soubory, vydejte pouze řádky v souboru 1, které nejsou v souboru 2.

Ostatní možnosti také nefungují:

  • Za použití ubuntu-14.04-desktop-AMD64.manifest soubor ( zde pro Ubuntu 14.04) místo /var/log/installer/initial-status.gz. Další balíčky jsou zobrazeny jako ručně nainstalované, i když nejsou.
  • Použitím apt-mark showauto namísto /var/log/installer/initial-status.gz. apt-mark například nezahrnuje balíček xserver-xorg, zatímco druhý soubor ano.

Jako reference jsem použil různé další příspěvky StackExchange, žádné však nefungují a výše uvedené řešení:

Oba obsahují více balíčků než výše uvedené řešení.

ÚPRAVA: Co dělat, pokud jste upgradovali z předchozí verze:

Pokud jste upgradovali Ubuntu z jednoho vydání na další, budete pravděpodobně muset tento proces upravit. V takovém případě bych kromě souboru initial-status.gz z aktuální verze zkontroloval soubor manifestu novější verze (viz výše). Můžete to snadno udělat pouhým přidáním dalšího srovnání. Použití pouze souboru manifestu nebude fungovat, protože soubor manifestu bohužel neobsahuje vše, co soubor initial_status.gz obsahuje (zaškrtl jsem).

222
jmiserez

V novějších verzích balíčku apt je také příkaz apt-mark

apt-mark showmanual
66
Daniel Alder

U Ubuntu 16.04 se podívejte do souboru protokolu /var/log/apt/history.log.

Například:

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

Není to dokonalé, ale je docela dobré objasnit, co jsem nainstaloval ručně. Vložte -B 1 na grepu, abyste viděli, kdy byl nainstalován.

Příklad výstupu

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

Nejste si jisti, zda to vyzvedne aptitude nebo ne. Nezdá se, že by instalace vyzvedávala z desktopové aplikace Ubuntu Software.

23
s1037989

apt-mark showauto | grep -iE '^foobar$' vydá "foobar", pokud byl balíček nainstalován automaticky, nic jiného.

aptitude search '!~M ~i' zobrazí seznam balíčků, které nebyly nainstalovány automaticky. Je to škoda aptitude nebude součástí výchozí instalace na Ubuntu Desktop od 10.10.

20
Li Lo

Následující skript vytiskne všechny balíčky, které nejsou nastaveny na automatickou instalaci, a proto byly nainstalovány ručně:

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

je založeno na tom, jak apt-mark vytiskne automaticky nainstalované balíčky.

9
txwikinger

Chcete-li získat seznam všech balíčků (neinstalovaných, nainstalovaných uživatelem nebo standardně nainstalovaných ve všech PPA), apt používá následující metodu:

apt list [option]

Možné možnosti k tomu jsou:

--installed pro zobrazení pouze balíčků nainstalovaných v systému (z přibližně 50 000+)

--manual-installed pro výpis balíčků, které byly explicitně nainstalovány příkazem, buď přímo, nebo jako závislosti.

Můžete také:

apt list --manual-installed | grep -F \[installed\] získat seznam balíčků, které vyplynuly pouze z uživatelských příkazů a jejich závislostí, a získat o nich další informace, jako je podporovaná verze a architektura (x86, x86_64, AMD64, všechny atd.)

8
axolotl

Jak několik lidí komentovalo, showmanual apt-mark se zdá být trochu buggy (a já jsem to nahlásil jako chyba 727799 ). Když to používám, ve skutečnosti hlásí spoustu věcí, které nejsou ani přihlášeny/var/lib/apt/Extended_states (kde se to má uložit) a apt-get není protokolování věcí tak, jak jsou nainstalovány v/var/lib/apt/Extended_states (právě v/var/lib/dpkg/status). Skript python výše od txwikinger výše čerpá přímo z/var/lib/apt/Extended_states, ale pokud jej používáte dnes, možná nebude fungovat syntaxe (moje právě začala generovat chyby s Kubuntu 13.10). Aktualizovaná syntaxe je:

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

Pro mě to byl velmi krátký seznam 5 položek, které se nezdají být ani přesné.

5
cluelesscoder

Chtěl bych dát GUI řešení.

enter image description here

  1. Otevřít Synaptic Package Manager

  2. Přejít na Status

  3. Klikněte na Installed (manual)

Poskytne seznam balíků nainstalovaných ručně pomocí apt nebo aptitude.

Bohužel jsem v Custom Filters Nenašel žádnou možnost zjistit, zda byl balíček foobar nainstalován ručně nebo automaticky.

Pokud je balíček pod Installed, ale ne pod Installed (manual), byl nainstalován automaticky. Pokud je balíček pod Installed (manual), byl nainstalován ručně.

4
blueray

Pokud vám nikdo nedá příjemnou odpověď pomocí příkazu apr-niečo, můžete to udělat tvrdě. Apt-get ukládá své informace do/var/lib/apt/extended_states. Do tohoto souboru bude přidán každý automaticky nainstalovaný soubor. Pokud instalujete balíček již v tomto souboru ručně, balíček zůstane v tomto souboru, ale s automatickou instalací: 0 ve druhém řádku. Není odstraněn.

Poznámka: Jak se očekávalo, lepší odpovědi, které pravděpodobně budou fungovat, pokud se objeví změny umístění souboru. Udržuji svůj jen pro případ, že informace o umístění souboru jsou užitečné.

2
Javier Rivera

Po velkém googlování se mi podařilo tento skript sestavit. Funguje to pro mě dobře:

# 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
2
dufferZafar

Jak řekl Li Lo, apt-mark showauto by vám měl dostat automaticky nainstalovaný seznam věcí.

Nyní, aby se ukázaly věci, které jsou nainstalovány ručně, ukáže se, že existuje krásný jednoduchý modifikátor vyhledávání aptitude. Ale vy to nechcete dělat. Chcete napsat obrovský bashový příkaz, který provede nějakou raketovou vědu.

Poznámka: Toto je více ukázka toho, jak skvěle vypadáte, když vyrazíte masivní bash příkazy všem svým přátelům.

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

Rozdělil jsem to na dvě řádky kvůli čitelnosti. Co to dělá?

  • Nejprve si vyžádáme dpkg pro seznam nainstalovaných balíčků.
  • Filtrujeme ty, které jsou skutečně nainstalované (nejen zbytková konfigurace)
  • Odřízneme status
  • Porovnáme tento seznam s automatickým seznamem od apt-mark
  • Houpáme se, protože můžeme.
1
Oli