Vraag Lijst met handmatig geïnstalleerde pakketten genereren en afzonderlijke pakketten opvragen


Ik zou graag een lijst ontvangen van pakketten die handmatig zijn geïnstalleerd door apt of aptitude en in staat zijn uit te vinden of een foobar pakket is handmatig of automatisch geïnstalleerd. Is er een nette manier om dat te doen vanaf de opdrachtregel?


146
2017-08-16 17:07


oorsprong


Zien dit antwoord op unix.stackexchange.com voor een oplossing die voorraadpakketten uitfiltert. - Dirk Bergstrom
Mogelijk duplicaat? - askubuntu.com/questions/365 - jrg♦
mogelijk duplicaat van Is het mogelijk om te vertellen welke pakketten ik heb geïnstalleerd die zich niet in de vanilla-installatie bevinden? - Jorge Castro
Echt een goede oplossing die pakketten die standaard zijn geïnstalleerd uitsluit: Ubuntu lijst expliciet geïnstalleerde pakketten - pcworld
Pas op de opmerkingen van de antwoorden hier. Mensen zeggen niet dat er veel meer pakketten verschijnen, maar ze vergeten dat er afhankelijkhedenpakketten zijn geïnstalleerd vanuit een handleiding die is geïnstalleerd. - Andre Figueiredo


antwoorden:


U kunt een van deze twee oneliners gebruiken. Beide geven exact dezelfde uitvoer op mijn machine en zijn nauwkeuriger dan alle oplossingen die tot nu toe (6 juli 2014) zijn voorgesteld in deze vraag.

Gebruik makend van apt-mark:

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

Gebruik makend van 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)

Zeer weinig pakketten vallen nog steeds door de kieren, hoewel ik deze vermoed zijn feitelijk geïnstalleerd door de gebruiker, hetzij direct na de installatie door de taallokalisatie-instelling of b.v. via het Totem-codec-installatieprogramma. Ook lijken de linux-header-versies zich op te hopen, ook al heb ik alleen de niet-versie-specifieke metapackage geïnstalleerd. Voorbeelden:

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

Hoe werkt het:

  1. Download de lijst met handmatig geïnstalleerde pakketten. Voor aanleg, de extra sed verwijdert resterende witruimte aan het einde van de regel.
  2. Haal de lijst met pakketten meteen na een nieuwe installatie op.
  3. Vergelijk de bestanden, voer alleen de regels in bestand 1 uit die niet aanwezig zijn in bestand 2.

Andere mogelijkheden werken niet zo goed:

  • De ... gebruiken ubuntu-14.04-desktop-amd64.manifest het dossier (hier voor Ubuntu 14.04) in plaats van /var/log/installer/initial-status.gz. Meer pakketten worden getoond als handmatig geïnstalleerd, ook al zijn ze dat niet.
  • Gebruik makend van apt-mark showauto in plaats van /var/log/installer/initial-status.gz. apt-mark bijvoorbeeld niet het pakket xserver-xorg, terwijl het andere bestand dat wel doet.

Ik heb verschillende andere StackExchange-berichten gebruikt als verwijzingen, maar geen enkele werkt zo goed als de bovenstaande oplossing:

Beide bevatten meer pakketten dan de bovenstaande oplossing.

EDIT: wat te doen als u een upgrade van een eerdere release heeft uitgevoerd:

Als je Ubuntu van de ene release naar de andere hebt geüpgraded, moet je dit waarschijnlijk waarschijnlijk aanpassen. In dat geval zou ik het manifestbestand van de nieuwere versie (zie hierboven) naast het bestand initial-status.gz van de huidige release controleren. U kunt dat eenvoudig doen door gewoon een andere vergelijking toe te voegen. Alleen het manifestbestand gebruiken werkt niet, omdat het manifestbestand helaas niet alles bevat wat het initial_status.gz-bestand doet (ik controleerde).


165
2017-07-06 15:01



Dit werkte niet voor mij omdat /var/log/installer/initial-status.gz ontbreekt. Ook wil ik weten of dit afhankelijk is van apts-markering van manual of niet? - Anwar
Helaas is er geen manifest voor serverversies. - Antti Haapala
Ik heb de showmanual commando (hieronder). En gebruiken comm om de twee (gesorteerde) lijsten te vergelijken. De showmanual resultaat gaf me 1.840 meer unieke pakketten van apt-mark showmanual niet weergegeven door deze methode. GEEN pakketten waren uniek voor de uitvoer hiervan comm-opdracht. Ik denk dat het interessanter is om dat voor mijn pc op te nemen, 894 pakketten worden vermeld in Beide resultaten. Ik weet niet zeker waarom er zo'n enorme discrepantie is. Sommige (veel?) Pakketten lijken releasespecifiek te zijn. Anderen zoals XOrg, GTK-componenten en lib* dingen kunnen updates zijn. Hoe dan ook dit antwoord is een goed begin. - will
Ik heb alleen je oplossingen vergeleken met apt-mark showmanual. Het is interessant hoeveel verschillen zichtbaar zijn. je lijst heeft 238 pakketten terwijl showmanual 1717 pakketten retourneert. Van de 2179 geïnstalleerde pakketten zijn er slechts 223 in beide lijsten, 15 zijn alleen in de jouwe (voorbeelden: nodejs, lightdm) en 223 zijn alleen in showmanual (voorbeelden: xserver-xorg, ubuntu-desktop). Het voelt alsof je lijst nuttiger is, maar zonder te weten waar deze verschillen vandaan komen, is het niet eenvoudig om te beslissen ... (maar ik weet zeker dat ik handmatig nginx en lightdm heb geïnstalleerd ...) [sorry dat ik net schreef hetzelfde ;)] - Daniel Alder


In nieuwere versies van het pakket apt is er ook de opdracht apt-mark

apt-mark showmanual

54
2018-05-17 16:21



Precies het antwoord dat ik zocht. - Wolfer
Dit toont veel meer pakketten dan ik handmatig heb geïnstalleerd. - Umang
@Umang Je hebt gelijk. Ik zou zeggen dat dit niet zo was toen ik dit antwoord schreef. Er is geen reden op mijn systeem om te overwegen linux-image-3.11.0-*-generic enz. als handleiding - Daniel Alder
@Umang misschien zal dit je helpen askubuntu.com/questions/432743/..., maar het antwoord wordt niet geaccepteerd. Feit is, dat veel pakketten van een nieuwe installatie al als handmatig zijn gemarkeerd. Maar er zijn nog steeds enkele vreemde dingen. Om bij mijn voorbeeld te blijven: linux-image-3.13.0-24-generic is handmatig, maar de huidige linux-image-3.13.0-27-generic is automatisch. Het lijkt erop dat een upgrade van een verwijzingspakket (in dit geval linux-image-generic, die de afhankelijkheden veranderde), wordt de handmatige markering automatisch ingesteld - Daniel Alder
@DanielAlder sommige pakketten van een nieuwe installatie moeten als handmatig worden gemarkeerd. Als er geen pakketten zijn gemarkeerd als handmatig, kan het hele systeem worden verwijderd met apt-get autoremove. Dit is absoluut niet wat je wilt. - Anton K


apt-mark showauto | grep -iE '^foobar$' zal "foobar" uitvoeren als het pakket automatisch is geïnstalleerd, niets anders.

aptitude search '!~M ~i' zal de pakketten vermelden die niet automatisch werden geïnstalleerd. Het is jammer dat aptitude vanaf 10.10 geen onderdeel zal zijn van de standaardinstallatie op Ubuntu Desktop.


19
2017-08-16 17:32



aptitude search toont ALLE pakketten niet alleen degene die handmatig worden geïnstalleerd (ik neem aan dat dit is wat de OP wilde) - Oli♦
@ Oli: zoek naar patronen voor aptitude-zoekopdrachten; het patroon dat ik daar gebruik, moet precies doen wat het OP wil. - Li Lo
ik rende het. Het toont een hele reeks pakketten die niet zijn geïnstalleerd. - Oli♦
Mijn fout. Gecorrigeerd. Dank je. - Li Lo
Er is hier iets niet in orde, dat ik gebruik aptitude search '!~M ~i' en het geeft 1043 pakketten weer. Het is op geen enkele manier mogelijk dat ik zoveel pakketten handmatig heb geïnstalleerd. - ThatGraemeGuy


Bekijk voor Ubuntu 16.04 het logbestand /var/log/apt/history.log.

Bijvoorbeeld:

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

Het is niet perfect, maar het is redelijk goed in het duidelijk maken wat ik met de hand heb geïnstalleerd. Zet een -B 1 op de grep om te zien wanneer deze is geïnstalleerd.

Voorbeelduitvoer

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

Niet zeker of dit oppikt aptitude of niet. Het lijkt geen installaties op te nemen van de Ubuntu Software desktop-app.


11
2018-02-04 18:48





In het volgende script worden alle pakketten afgedrukt die niet zijn ingesteld op automatisch installeren en die daarom handmatig zijn geïnstalleerd:

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

het is gebaseerd op hoe apt-mark de automatisch geïnstalleerde pakketten afdrukt.


8
2017-08-16 19:42



Een pluim voor u, mijnheer. Dit werkt eigenlijk, in tegenstelling tot het geaccepteerde antwoord. - Irfy
toon slechts een paar pakketten voor mij --- ik mis er zeker veel van. - Rmano
Hetzelfde hier, zeker met het missen van handmatig geïnstalleerde pakketten, direct nadat ik ze had geïnstalleerd. - David Ljung Madison
Gebruik makend van sys.exit(1) zonder import sys kan resulteren in een fout in nieuwere versies van python. Een van beide import sys of gebruik exit(1). - Videonauth


Zoals meerdere mensen hebben opgemerkt, lijkt aptman-showmanual een beetje buggy te zijn (en ik meldde het als bug 727799). Wanneer ik het gebruik, rapporteert het eigenlijk een heleboel dingen die niet eens zijn ingelogd / var / lib / apt / extended_states (waar dit hoort te worden opgeslagen) en apt-get is niet loggen dingen zoals geïnstalleerd in / var / lib / apt / extended_states (alleen in / var / lib / dpkg / status). Het python-script van txwikinger hierboven haalt rechtstreeks uit / var / lib / apt / extended_states, maar als u het vandaag gebruikt, werkt de syntaxis mogelijk niet (de mijne is net begonnen met het genereren van fouten met Kubuntu 13.10). Bijgewerkte syntaxis is:

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

Voor mij was dit een zeer korte lijst van 5 items die ook niet klopt.


5
2017-10-26 23:28



Gebruik makend van sys.exit(1) zonder import sys kan resulteren in een fout in nieuwere versies van python. Een van beide import sys of gebruik exit(1). - Videonauth


Om een ​​lijst te krijgen van alle pakketten (niet geïnstalleerd, geïnstalleerd door de gebruiker of standaard geïnstalleerd, in alle PPA's), apt hanteert de volgende methode:

apt list [option]

De mogelijke opties die hiervoor nuttig zijn, zijn:

--installed om alleen de pakketten weer te geven die op het systeem zijn geïnstalleerd (van zo'n 50.000+)

--manual-installed om de pakketten te vermelden die waren uitdrukkelijk geïnstalleerd door een commando, hetzij direct, of als afhankelijkheden.

Als alternatief kunt u doen:

apt list --manual-installed | grep -F \[installed\] om een ​​lijst met pakketten te krijgen die het resultaat zijn van gebruikerscommando's en hun afhankelijkheden, en om er aanvullende informatie over te krijgen, zoals versie en architectuur ondersteund (x86, x86_64, amd64, alles, etc.)


4
2018-02-07 14:01





Zoals Li Lo zei, apt-mark showauto zou je een dikke lijst moeten geven van automatisch geïnstalleerde dingen.

Nu om de dingen te laten zien die handmatig zijn geïnstalleerd, blijkt er een mooie eenvoudige zoekmodifier voor aptitude te zijn. Maar dat wil je niet doen. Je wilt een enorm bashcommando schrijven dat wat raketwetenschap doet.

Notitie: Dit is meer een illustratie van hoe cool je eruit ziet om enorme bash-commando's uit te schakelen naar al je vrienden. 

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

Ik heb het op twee regels gebroken voor leesbaarheid. Wat doet dit?

  • Eerst vragen we dpkg om een ​​lijst met geïnstalleerde pakketten.
  • We filteren die voor degenen die daadwerkelijk zijn geïnstalleerd (niet alleen de resterende configuratie)
  • We hakken de status af
  • We vergelijken die lijst met de geautomatiseerde lijst van apt-mark
  • We rocken omdat we kunnen.

1
2017-08-16 17:41



Ik betwijfel of dit juist is, omdat dpkg vaak pakketten toont die niet zijn geïnstalleerd - txwikinger
Ik weet wat je bedoelt, maar mijn bas-fu is niet sterk genoeg. Ik weet dat je de status van dpkg-query kunt tonen, grep dat naar beneden en snijd de status af. Ik zal het proberen. - Oli♦
comm -3 <(dpkg -l | grep '^ii' | cut -d \ -f 3|sort) <(apt-mark showauto|sort) is behoorlijk beter;) - LassePoulsen


Als niemand je een aardig antwoord geeft met een apr-something commando, dan kun je het doen moeilijke manier. Apt-get slaat zijn info op in / var / lib / apt / extended_states. Elk bestand dat automatisch wordt geïnstalleerd, wordt aan dit bestand toegevoegd. Als u een pakket al handmatig in dit bestand installeert, blijft het pakket in dit bestand staan, maar met Automatisch geïnstalleerd: 0 in de tweede regel. Het is niet verwijderd.

Opmerking: Zoals verwacht, zullen er betere antwoorden zijn die waarschijnlijk werken als wijzigingen in de bestandsplaatsing zijn verschenen. Ik bewaar de mijne voor het geval dat de informatie over de bestandslocatie nuttig is.


1
2017-08-16 17:44



Nee. Ik heb dat bestand snel bekeken om te zien dat lifeare werd gemarkeerd als automatisch geïnstalleerd. Ik deed een apt-get install liferea en het installeerde niet maar ik kreeg output die iets was in de zin van "gemarkeerd als handmatig geïnstalleerd". Nu liferea is nog steeds in het bestand, behalve de volgende regel heeft een 0 inplaats van een 1. Ook moet u uw regex-patroon wijzigen in " foobar$" in plaats van gewoon foobar. - Umang
Dat is waar. Mijn fout, in mijn systeem is er geen regel met 0, maar het zou een zeldzame gebeurtenis moeten zijn. Ik update het antwoord voor het geval dat. - Javier Rivera


Na veel gegoogeld te hebben, heb ik dit script kunnen samenstellen. Het werkt goed voor mij:

# 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

1
2018-05-31 20:28



Je zou kunnen gebruiken sort -u in plaats van sort | unique. Als apt-markgeeft geen architectuur weer, u dient het uit de output van dpkg te verwijderen vóór de ingestelde bewerkingen (of gebruik dpkg-query -W -f='${Package}\n'). Bovendien kan dpkg een aantal pakketten vermelden die momenteel niet zijn geïnstalleerd. Wat betreft "desc", zou u `dpkg-query -W-f = '# $ {binary: Summary} \ n' $ pack kunnen gebruiken, wat sneller is. - jarno
Oh, apt-markkan architectuur voor sommige pakketten weergeven, maar niet voor zo veel als dpkg -l. - jarno
apt-cache search is langzaam. Een lijst van geïnstalleerde datums van tevoren krijgen door iets dergelijks te gebruiken help.ubuntu.com/community/ListInstalledPackagesByDate kan efficiënter zijn - opticyclic