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

148

Chtěl bych získat seznam balíků nainstalovaných ručněapt neboaptitude a zjistit, zda byl balíčekfoobar nainstalován ručně nebo automaticky. Existuje nějaký čistý způsob, jak to udělat z příkazového řádku?

    
dané Umang 16.08.2010 19:07

12 odpovědí

165

Můžete použít jednu z těchto dvou jednorázových reklam. Oba způsobují stejný výkon na mém stroji a jsou přesnější než všechna navržená řešení (6. července 2014) v této otázce.

Používáníapt-mark:

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

Používání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)

Velmi málo balíků stále spadne do trhlin, ačkoli mám podezření, že tyto jsou skutečně nainstalovány uživatelem, a to buď hned po instalaci prostřednictvím nastavení jazykové lokalizace, např. prostřednictvím instalátoru kodeku Totem. Také zdá se, že se i akumulují verze verze záhlaví linuxu, přestože jsem nainstaloval pouze metabalík specifický pro verzi bez verze. 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 přidá dalšísed zbývající prázdné místo na konci řádku.
  2. Získejte seznam instalovaných balíků ihned po nové instalaci.
  3. Porovnejte soubory pouze s výstupními řádky v souboru 1, které nejsou v souboru 2.

Ostatní možnosti také nefungují:

  • Použijte souborubuntu-14.04-desktop-amd64.manifest ( zde pro Ubuntu 14.04). z/var/log/installer/initial-status.gz. Další balíky se zobrazují jako ručně nainstalované, i když nejsou.
  • Použitíapt-mark showauto namísto/var/log/installer/initial-status.gz. apt-mark například neobsahuje balíček xserver-xorg, zatímco druhý soubor dělá.

Jako odkazy jsem použil různé jiné příspěvky StackExchange, nicméně žádný z výše uvedených řešení nevyhovuje:

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

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

Pokud jste inovovali Ubuntu z jednoho vydání na druhý, pravděpodobně budete muset tento proces upravit. V takovém případě bych se podívat na soubor manifestu novější verze (viz výše) kromě souboru initial_state.gz z aktuální verze. Můžete to snadno udělat pouze přidáním jiného srovnání. Používání pouze souboru manifestu nebude fungovat, jelikož soubor manifestu bohužel neobsahuje vše, co soubor initial_status.gz provádí (zkontroloval jsem).

    
odpověděl jmiserez 06.07.2014 17:01
55

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

apt-mark showmanual
    
odpověděl Daniel Alder 17.05.2012 18:21
19

apt-mark showauto | grep -iE '^foobar$' bude výstup "foobar", pokud byl balík nainstalován automaticky, nic jiného.

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

    
odpověděl Li Lo 16.08.2010 19:32
12

U Ubuntu 16.04 si prohlédněte soubor protokolu/var/log/apt/history.log.

Například:

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

Není to perfektní, ale je to docela dobré, když jsem jasně vysvětlil, co jsem nainstaloval ručně. Vložte-B 1 na grep a uvidíte, 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, jestli to zvedneaptitude nebo ne. Nezdá se, že by z instalace softwaru Ubuntu pro stolní počítače vybral instalace.

    
odpověděl s1037989 04.02.2017 19:48
8

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.

    
odpověděl txwikinger 16.08.2010 21:42
5

Jak komentovali někteří lidé, apt-mark showmanual se zdá být trochu buggy (a hlásil jsem to jako chyba 727799 ). Když ji používám, ve skutečnosti hlásí spoustu věcí, které nejsou dokonce přihlášeny do souboru / var / lib / apt / extended_states (kde by měl být uložen) a apt-get není přihlašování věcí jako nainstalovaných / var / lib / apt / extended_states (právě v / var / lib / dpkg / status). Pythonový skript txwikinger výše čerpá z / var / lib / apt / extended_states přímo, ale pokud ho používáte dnes, syntaxe nemusí fungovat (můj právě začal 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 nezdá být přesný.

    
odpověděl cluelesscoder 27.10.2013 01:28
4

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

apt list [option]

Možné užitečné možnosti jsou následující:

--installed pro zobrazení pouze balíků, které jsou nainstalovány v systému (z přibližně 50 000 +)

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

Alternativně byste mohli:

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

    
odpověděl Aalok 07.02.2017 15:01
1

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

Chcete-li nyní ukázat ručně nainstalované věci, ukázalo se, že pro aptitude je krásný jednoduchý modifikátor vyhledávání. Ale nechcete to dělat. Chcete napsat velký příkaz pro bash, který dělá nějakou raketovou vědu.

Poznámka: Toto je spíše ilustrace toho, jak skvěle vypadáte, že vybíráte masivní příkazy bash 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)

Pro zrozumitelnost jsem ji rozbil na dvě řádky. Co to dělá?

  • Nejprve jsme dotaz dpkg pro seznam nainstalovaných balíků.
  • Filtrujeme ty, které jsou skutečně nainstalovány (nejen zbytkový config)
  • Zrušíme stav
  • Seznam porovnáváme s automatizovaným seznamem zapt-mark
  • Sloužíme, protože můžeme.
odpověděl Oli 16.08.2010 19:41
1

Pokud vám nikdo neposkytne příjemnou odpověď pomocí příkazu apr-something, můžete to udělat tvrdým způsobem . Apt-get ukládá informace v / var / lib / apt / extended_states. Jakýkoli soubor, který je nainstalován automaticky, bude do tohoto souboru přidán. Pokud nainstalujete balíček již v tomto souboru ručně, balíček zůstane v tomto souboru, ale s automatickým instalací: 0 na druhém řádku. Není odstraněn.

Poznámka: Jak očekáváte lepší odpovědi, které pravděpodobně budou fungovat, pokud se objeví změny umístění souborů. Já držím jen v případě, že informace o umístění souboru jsou užitečné.

    
odpověděl Javier Rivera 16.08.2010 19:44
1

Po mnoha hodinách jsem se podařilo sestavit tento skript. Funguje to dobře:

# 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
    
odpověděl dufferZafar 31.05.2015 22:28
0

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

  1. OtevřeteSynaptic Package Manager

  2. Přejít naStatus

  3. Klikněte naInstalled (manual)

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

Bohužel jsem nenašel žádnou možnost vCustom Filters zjistit, zda byl balíčekfoobar nainstalován ručně nebo automaticky.

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

    
odpověděl blueray 28.05.2018 17:39
-1

Zobrazí se seznam všech ručně nainstalovaných balíků bez: závislostí, odinstalovaných balíčků, balíků instalovaných během instalace systému.

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
}
    
odpověděl wieczorek1990 08.10.2014 15:39