Ignorar los paquetes que no están instalados actualmente cuando se usa "apt-get remove"

15

Tengo un escenario en el que me gustaría eliminar un conjunto de paquetes que se pueden instalar o no, y me gustaría que apt-get elimine los que están e ignore silenciosamente los que no. Algo como:

apt-get remove foo bar baz

que, si se instalaron foo y bar pero no fue baz, eliminaría foo y bar sin quejarse de baz. ¿Hay alguna forma de hacer esto?

Cosas que he probado que no han funcionado, con cups-dbg como mi paquete de chivo expiatorio realmente instalado para ser eliminado:

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

Sé que podría hacer esto con un script de shell y algo de dpkg --listmagia, pero me gustaría evitar cualquier complejidad que no sea absolutamente necesaria.

JavaWizard
fuente
Esta respuesta funcionó para mí al final. Solución tonta para un problema tonto. Tenga en cuenta que en realidad hay un defecto en Launchpad sobre esto, así que no dude en contribuir.
Jeff

Respuestas:

8

¿Recurrir a una herramienta de nivel inferior como dpkg es una opción?

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 ...

Para eliminar los archivos de configuración de paquetes, utilice la purga de la siguiente manera

dpkg --purge foo bar libperl-dev
barti_ddu
fuente
1
Debería haber mencionado que los paquetes que se eliminarán pueden tener dependencias inversas, y me gustaría que también se eliminen. Apt-get, por lo tanto, es mucho mejor que dpkg, pero aceptaré su respuesta, ya que parece que realmente no hay una mejor manera de hacerlo.
javawizard
7

Yo uso apt-get remove --purge(aka apt-get purge) para la dependencia que sigue con una lista de paquetes. Para manejar paquetes que no existen, filtro los paquetes que no están instalados con el siguiente 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
Lucas
fuente
3

Para Debian ≤ 9, es posible usar solo en aptitudelugar de apt-get:

sudo aptitude remove -y cups-dbg bogus-package

Aptitude imprime advertencias, pero continúa eliminando sus paquetes:

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

Si desea purgar (eliminar archivos de configuración de paquetes) en lugar de eliminar (mantener archivos de configuración), tenga en cuenta que aptitudesolo purga los paquetes proporcionados directamente, mientras que las dependencias no utilizadas solo se eliminan. Sin embargo, puede purgar todos los paquetes eliminados en un segundo paso:

apt-get -y purge $(dpkg -l | grep ^rc | awk '{print $2}')
vog
fuente
Okay. a veces, el bogus-packagejusto tenía el nombre equivocado. entonces, en caso de que tuviéramos 500 paquetes, sería mejor analizar también los paquetes falsos y hacer algunos trucos (por ejemplo, números después del nombre de falta, etc., entonces, ¿puedes dar algunas pistas sobre cómo hacer esto? ..
nyxee
@nyxee Propongo hacer esto como una nueva pregunta, señalando exactamente lo que quieres lograr.
vog
1
Esta sería una buena solución, excepto 1) aptitude ya no está instalado por defecto en Ubuntu 18.04 y 2) aptitude tiene una forma bastante diferente (podría decirse extraña) de manejar comodines.
Jeff el
Esto no está funcionando para mí en Debian 10. veo,Couldn't find any package whose name or description matched 'QUX' Unable to apply some actions, aborting
pdoherty926
@ pdoherty926 Gracias por la pista. Verifiqué esto y ajusté mi respuesta en consecuencia.
vog
0

Otro pequeño 2-liner si alguien necesita usar 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
}

Explicacion:

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!
Meir
fuente
¡Bienvenido a SuperUser! ¿Agregaría más descripción a su respuesta sobre lo que hace su script y cómo lo hace?
El8dN8
@ El8dN8 Explicación agregada
Meir