Manuálisan telepített csomagok listájának létrehozása és egyedi csomagok lekérdezése

148

Szeretnék aapt vagyaptitude által kézzel telepített csomagok listáját, és tudni szeretné, hogy afoobar csomag manuálisan vagy automatikusan van-e telepítve. Van valami szép módja ennek a parancssorból?

    
készlet Umang 16.08.2010 19:07
forrás

12 válasz

165

Használhatja a két egyoldalas egyiket. Mindkettő ugyanolyan eredményt ad a gépemre, és pontosabb, mint az eddig javasolt összes megoldás (2014. július 6.).

apt-mark:

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

aptitude:

használata
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)

Nagyon kevés csomag még a repedéseken esik át, bár gyanítom, hogy ezek a ténylegesen a felhasználó által telepítésre kerültek, közvetlenül a telepítés után a nyelvi lokalizáció beállításán vagy a Totem codec telepítőn keresztül. Úgy tűnik, hogy a linux-header verziók is felhalmozódnak, még akkor is, ha csak a nem-verzió-specifikus metapackát telepítettem. Példák:

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

Hogyan működik:

  1. Szerezd meg a kézzel telepített csomagok listáját. Az aptitude esetében a továbbised szalagolja a maradék szóközöket a sor végén.
  2. Friss telepítés után szerezze be a telepített csomagok listáját
  3. Hasonlítsa össze a fájlokat, csak az 1. fájlban lévő sorokat adja ki, amelyek nem szerepelnek a 2. fájlban.

Más lehetőségek nem működnek:

  • Aubuntu-14.04-desktop-amd64.manifest fájl ( itt az Ubuntu 14.04-hez) /var/log/installer/initial-status.gz. Több csomag kézzel telepítve van, még akkor is, ha nem.
  • apt-mark showauto helyett/var/log/installer/initial-status.gz helyett. Aapt-mark például nem tartalmazza az xserver-xorg csomagot, míg a másik fájl nem.

Különféle más StackExchange bejegyzéseket használtam referenciaként, de egyik sem működik a fenti megoldással:

Mindkettő több csomagot sorol fel, mint a fenti megoldás.

EDIT: Mi a teendő, ha korábban frissítetted egy korábbi verziót:

Ha Ön az egyik kiadásról a másikra frissítette az Ubuntut, valószínűleg be kell állítania ezt a folyamatot. Ebben az esetben az aktuális kiadás kezdeti status.gz fájlján kívül ellenőrizem az újabb kiadás manifeszt fájlját (lásd fent). Ezt egyszerűen csak egy másik összehasonlítás hozzáadásával teheti meg. Csak a manifest fájl nem fog működni, mivel a manifest fájl sajnos nem tartalmaz mindent, amit a initial_status.gz fájl nem (ellenõrizem).

    
válasz adott jmiserez 06.07.2014 17:01
forrás
55

A csomag új verziójában apt-mark parancs

is található
apt-mark showmanual
    
válasz adott Daniel Alder 17.05.2012 18:21
forrás
19

Aapt-mark showauto | grep -iE '^foobar$' kiadja a "foobar" kifejezést, ha a csomagot automatikusan telepítette, különben semmi.

Aaptitude search '!~M ~i' felsorolja a nem telepített csomagokat. Kárpótlási alkalmasság nem része az Ubuntu Desktop alapértelmezett telepítésének a 10.10-től kezdődően.

    
válasz adott Li Lo 16.08.2010 19:32
forrás
12

Az Ubuntu 16.04 esetében nézze meg a/var/log/apt/history.log naplófájlt.

Például:

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

Nem tökéletes, de elég jól megmagyarázni, hogy pontosan mit telepítettem kézzel. Helyezzen egy-B 1 -ot a grep-re, hogy megtekinthesse, mikor telepítve van.

Példa kimenet

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

Nem biztos abban, hogy ez aaptitude -ot felveszi-e vagy sem. Úgy tűnik, nem veszi fel a telepítéseket az Ubuntu Software asztali alkalmazásból.

    
válasz adott s1037989 04.02.2017 19:48
forrás
8

A következő parancsfájl kinyomtat minden olyan csomagot, amely nincs beállítva az automatikus telepítésre, és ezért manuálisan telepítve van:

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

ez az alapja annak, hogy az apt-mark kinyomtatja az automatikusan telepített csomagokat.

    
válasz adott txwikinger 16.08.2010 21:42
forrás
5

Ahogy néhány ember megjegyezte, az apt-mark showmanual egy kicsit buggyannak tűnik (és a következőket jelentettem: bug 727799 ). Amikor használom, valójában több olyan dolgot jelent, amelyek még nem jelentkeztek be a / var / lib / apt / extended_states fájlba (ahol ez valószínűleg tárolásra kerül), és az apt-get nem naplózza a dolgokat, / var / lib / apt / extended_states (csak a / var / lib / dpkg / állapotban). A fenti txwikingerből származó python szkript közvetlenül a / var / lib / apt / extended_states-ból származik, de ha ma használod, a szintaxis nem működik (az enyém csak elkezdett hibákat generálni a Kubuntu 13.10-el). Frissített szintaxis:

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

Számomra ez volt egy nagyon rövid lista az 5 tételből, amely nem tűnik pontosnak.

    
válasz adott cluelesscoder 27.10.2013 01:28
forrás
4

Ahhoz, hogy a (z)apt összes csomagot (telepítve, telepítve a felhasználó által vagy alapértelmezés szerint telepítve legyen minden HTM-ben), a következő módszert alkalmazza:

apt list [option]

Az ehhez szükséges lehetőségek:

--installed, hogy csak a rendszeren telepített csomagokat jelenítse meg (kb. 50 000 + -kal)

--manual-installed a kifejezetten csomagok listájának felsorolására egy parancs segítségével, akár közvetlenül, akár függőségekként.

Alternatív megoldásként:

apt list --manual-installed | grep -F \[installed\] hogy megkapja a csomagok listáját, amelyek csak a felhasználói parancsokból és azok függőségéből származnak, és további információkat kaphatnak rájuk, mint például a verzió és az architektúra támogatott (x86, x86_64, amd64, összes stb.)

    
válasz adott Aalok 07.02.2017 15:01
forrás
1

Ahogy Li Lo elmondta, a (z)apt-mark showauto -nak meg kell adnia egy kövér listát a telepített dolgokról.

A manuálisan telepített dolgok megjelenítéséhez kiderül, hogy van egy szép egyszerű keresési módosító az alkalmassághoz. De ezt nem akarod megtenni. Egy hatalmas bash parancsot akarsz írni, ami valamilyen rakéta tudományt tartalmaz.

Megjegyzés: Ez inkább illusztrálja, hogy mennyire hűvös lesz a tömeges bashparancsok leküzdése minden barátodnak.

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

Két sort olvastam olvashatóságra. Mit csinál ez?

  • Először lekérdezzük a dpkg-t a telepített csomagok listájához.
  • Szűrjük azokat a ténylegesen telepített fájlokat (nem csak a maradék konfigurációt)
  • Elválasztjuk az állapotot
  • Összehasonlítjuk ezt a listát aapt-mark
  • Kihúzzuk, mert tudjuk.
válasz adott Oli 16.08.2010 19:41
forrás
1

Ha senki sem ad egy kellemes választ egy apr-something paranccsal, akkor az hard way . Az Apt-get a info / var / lib / apt / extended_states fájljait tárolja. Minden fájl automatikusan hozzáadódik ehhez a fájlhoz. Ha manapság már telepíti a fájlt, akkor a csomag ebben a fájlban marad, de az automatikus telepítés: 0 a második sorban. Nem törölve.

Megjegyzés: Várakozásaink szerint a jobb megoldások valószínűleg működni fognak, ha megjelenik a fájlelhelyezés módosítása. Csak akkor tartom az enyémet, ha a fájl helyén lévő információ hasznos.

    
válasz adott Javier Rivera 16.08.2010 19:44
forrás
1

A googlálás után sikerült összeállítanom ezt a szkriptet. Jól működik nekem:

# 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
    
válasz adott dufferZafar 31.05.2015 22:28
forrás
0

Szeretnék GUI megoldást adni.

  1. Nyisson megSynaptic Package Manager

  2. Ugrás aStatus

  3. kifejezésre
  4. Kattintson aInstalled (manual)

  5. gombra

Megjeleníti az apt vagy aptitude által manuálisan telepített csomagok listáját.

Sajnos nem találtam semmilyen lehetőséget aCustom Filters -on annak megállapítására, hogy afoobar csomagot kézzel vagy automatikusan telepítették-e.

Ha a csomagInstalled alatt van, de nem aInstalled (manual) alatt, akkor automatikusan telepítve lett. Ha a csomagInstalled (manual) alatt van, akkor kézzel telepítette.

    
válasz adott blueray 28.05.2018 17:39
forrás
-1

Ezzel minden manuálisan telepített csomagot felsorolhat: függőségek, eltávolított csomagok, a rendszer telepítésekor telepített csomagok.

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
}
    
válasz adott wieczorek1990 08.10.2014 15:39
forrás