Ignora i pacchetti che non sono attualmente installati quando si utilizza "apt-get remove"


15

Ho uno scenario in cui vorrei rimuovere una serie di pacchetti che possono o non possono essere installati e vorrei apt-get per rimuovere quelli che sono e ignorare silenziosamente quelli che non lo sono. Qualcosa di simile a:

apt-get remove foo bar baz

che, se fosse installato foo e bar ma non lo fosse baz, rimuoverebbe foo e bar senza lamentarsi di baz. C'è un modo per fare questo?

Cose che ho provato che non hanno funzionato, con cups-dbg come pacchetto effettivamente installato come capro espiatorio da rimuovere:

jcp@a-boyd:~$ sudo apt-get remove -y cups-dbg bogus-package
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package bogus-package

jcp@a-boyd:~$ sudo apt-get remove --ignore-missing cups-dbg bogus-package
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package bogus-package

jcp@a-boyd:~$ sudo apt-get remove --fix-broken cups-dbg bogus-package
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package bogus-package

So che potrei farlo con uno script di shell e un po 'di dpkg --listmagia, ma mi piacerebbe evitare qualsiasi complessità che non sia assolutamente necessaria.


Questa risposta ha funzionato per me alla fine. Soluzione stupida per un problema stupido. Nota che in realtà c'è un difetto su Launchpad al riguardo, quindi sentiti libero di contribuire.
Jeff

Risposte:


8

Tornare allo strumento di livello inferiore come dpkg è un'opzione?

dpkg --remove foo bar libperl-dev
dpkg: warning: ignoring request to remove foo which isn't installed
dpkg: warning: ignoring request to remove bar which isn't installed
(Reading database ... 169132 files and directories currently installed.)
Removing libperl-dev ...

Per rimuovere i pacchetti, i file di configurazione utilizzano purge come di seguito

dpkg --purge foo bar libperl-dev

1
Avrei dovuto menzionare che i pacchetti da rimuovere possono avere dipendenze inverse e vorrei che anche quelli venissero rimossi. Apt-get è quindi molto meglio di dpkg, ma accetterò la tua risposta poiché sembra che non ci sia davvero un modo migliore per farlo.
javawizard,

7

Uso apt-get remove --purge(aka apt-get purge) per la dipendenza che segue con un elenco di pacchetti. Per gestire i pacchetti che non esistono, filtro i pacchetti che non sono installati con il seguente script.

pkgToRemoveListFull="cups-dbg bogus-package"
pkgToRemoveList=""
for pkgToRemove in $(echo $pkgToRemoveListFull); do
  $(dpkg --status $pkgToRemove &> /dev/null)
  if [[ $? -eq 0 ]]; then
    pkgToRemoveList="$pkgToRemoveList $pkgToRemove"
  fi
done
apt-get --yes --purge remove $pkgToRemoveList

3

Per Debian ≤ 9, è possibile usare semplicemente aptitudeinvece di apt-get:

sudo aptitude remove -y cups-dbg bogus-package

Aptitude stampa gli avvisi, ma continua a rimuovere i pacchetti comunque:

Couldn't find any package whose name or description matched "bogus-package"
...
Removing cups-dbg ...
...

Se si desidera eliminare (eliminare i file di configurazione del pacchetto) anziché rimuoverlo (mantenere i file di configurazione), si noti che aptitudeelimina solo i pacchetti forniti direttamente, mentre le dipendenze non utilizzate vengono rimosse. Tuttavia, puoi eliminare tutti i pacchetti rimossi in un secondo passaggio:

apt-get -y purge $(dpkg -l | grep ^rc | awk '{print $2}')

ok. a volte, il bogus-packagegiusto aveva il nome sbagliato. quindi, nel caso avessimo bisogno di 500 pacchetti, sarebbe meglio analizzare anche i pacchetti fasulli e fare alcuni trucchi (ad esempio, i numeri dopo il nome della mancanza, ecc. quindi, per favore, puoi dare qualche suggerimento su come farlo ..
nyxee,

@nyxee Propongo di porlo come una nuova domanda, sottolineando esattamente cosa vuoi ottenere.
vog

1
Questa sarebbe una bella soluzione, tranne 1) aptitude non è più installato di default su Ubuntu 18.04 e 2) aptitude ha un modo abbastanza diverso (si potrebbe dire strano) di gestire i caratteri jolly.
Jeff

Questo non funziona per me su Debian 10. Vedo,Couldn't find any package whose name or description matched 'QUX' Unable to apply some actions, aborting
pdoherty926,

@ pdoherty926 Grazie per il suggerimento. Ho verificato questo e adattato la mia risposta di conseguenza.
Vog

0

Un altro piccolo 2-liner se qualcuno ha bisogno di usare apt:

purge_packages () {
  matchedPackages="$(echo "$(apt list --installed $* 2>/dev/null)" | grep -v '^Listing\.\.\.' | sed -s 's|[/ ].*||' | tr '\n' ' ' | sed 's/ *$//;s/^ *//')"
  [[ -n "$matchedPackages" ]] && apt purge -yq $matchedPackages
}

explination:

apt list --installed $*         # Lists packages matched from function args, the --installed flag limits results to installed packages

2>/dev/null                     # Disregard the warning about using this command in a script

grep -v '^Listing\.\.\.'        # Remove the first line of output that says "Listing..." or "Listing... Done"

sed -s 's|[/ ].*||'             # Remove the rest of the line after the package name (I'm checking for / or space though it looks like just the slash is needed but package names will never have a space)

tr '\n' ' '                     # Put it all on one line separated by spaces

sed 's/ *$//;s/^ *//'           # Remove trailing and leading spaces from the line so it will be blank during the test next line if nothing was matched

[[ -n "$matchedPackages" ]]     # Check if any packages were matched

apt purge -yq $matchedPackages  # Purge them!

Benvenuto in SuperUser! Aggiungeresti più descrizione alla tua risposta su ciò che fa il tuo script e come lo fa?
El8dN8

@ El8dN8 Aggiunta spiegazione
Meir
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.