Solo il codice
aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currentlyinstalled.txt
wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest \
| cut -f1 | sort -u > defaultinstalled.txt
comm -23 currentlyinstalled.txt defaultinstalled.txt
Spiegazione
Un modo di pensare a questo problema è dividerlo in tre parti:
- Come posso ottenere un elenco di pacchetti non installati come dipendenze?
- Come posso ottenere un elenco dei pacchetti installati per impostazione predefinita?
- Come posso ottenere la differenza tra questi due elenchi?
Come posso ottenere un elenco di pacchetti non installati come dipendenze?
Il seguente comando sembra funzionare sul mio sistema:
$ aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currentlyinstalled.txt
Approcci simili possono essere trovati nei link che Gilles ha pubblicato come commento alla domanda. Alcune fonti affermano che questo funzionerà solo se hai usato aptitude per installare i pacchetti; tuttavia, non uso quasi mai aptitude per installare i pacchetti e ho scoperto che funzionava ancora. Questo --disable-columns
impedisce a aptitude di riempire le righe di nomi di pacchetti con spazi vuoti che ostacolerebbero il confronto di seguito. Il | sort -u
smista i duplicati di file e rimuove. Questo rende il passaggio finale molto più semplice.
Come posso ottenere un elenco dei pacchetti installati per impostazione predefinita?
Nota: questa sezione inizia con un "percorso sbagliato" che penso sia illustrativo. Il secondo pezzo di codice è quello che funziona.
Questo è un po 'più complicato. Inizialmente ho pensato che una buona approssimazione sarebbero stati tutti i pacchetti che sono dipendenze dei meta-pacchetti ubuntu-minimal, ubuntu-standard, ubuntu-desktop e dei vari pacchetti correlati al kernel linux. Alcuni risultati sulle ricerche su Google sembravano utilizzare questo approccio. Per ottenere un elenco di queste dipendenze, ho prima provato quanto segue (che non ha funzionato):
$ apt-cache depends ubuntu-desktop ubuntu-minimal ubuntu-standard linux-* | awk '/Depends:/ {print $2}' | sort -u
Questo sembra tralasciare alcuni pacchetti che, a mio avviso, dovevano venire di default. Credo ancora che questo metodo dovrebbe funzionare se si costruisce il giusto elenco di metapacchetti.
Tuttavia, sembra che i mirror di Ubuntu contengano un file "manifest" che contiene tutti i pacchetti nell'installazione predefinita. Il manifest per Ubuntu 12.04.3 è qui:
http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest
Se cerchi in questa pagina (o nella pagina di un mirror più vicino a te):
http://mirror.pnl.gov/releases/precise/
Dovresti essere in grado di trovare il file ".manifest" che corrisponde alla versione e all'architettura che stai utilizzando. Per estrarre solo i nomi dei pacchetti ho fatto questo:
wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest | cut -f1 | sort -u > defaultinstalled.txt
L'elenco era probabilmente già ordinato e unico, ma volevo essere sicuro che fosse correttamente ordinato per facilitare il passaggio successivo. Ho quindi inserito l'output defaultinstalled.txt
.
Come posso ottenere la differenza tra questi due elenchi?
Questa è la parte più semplice poiché la maggior parte dei sistemi simili a Unix ha molti strumenti per farlo. Lo comm
strumento è uno dei molti modi per farlo:
comm -23 currentlyinstalled.txt defaultinstalled.txt
Questo dovrebbe stampare l'elenco delle righe che sono uniche per il primo file. Pertanto, dovrebbe stampare un elenco di pacchetti installati non presenti nell'installazione predefinita.
aptitude search '~i!~M' -F %p
?