Ignorieren Sie Pakete, die derzeit nicht installiert sind, wenn Sie "apt-get remove" verwenden.

15

Ich habe ein Szenario, in dem ich eine Reihe von Paketen entfernen möchte, die möglicherweise installiert sind oder nicht, und ich möchte apt-get, um diejenigen zu entfernen, die vorhanden sind, und diejenigen, die es nicht sind, stillschweigend zu ignorieren. Etwas wie:

apt-get remove foo bar baz

was, wenn foo und bar installiert wären, baz aber nicht, foo und bar entfernen würde, ohne sich über baz zu beschweren. Gibt es eine Möglichkeit, dies zu tun?

Dinge, die ich versucht habe, die nicht funktioniert haben, mit cups-dbg als meinem Sündenbock tatsächlich installiertes Paket, das entfernt werden soll:

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

Ich weiß, dass ich dies mit einem Shell-Skript und etwas dpkg --listMagie tun könnte , aber ich möchte jegliche Komplexität vermeiden, die nicht unbedingt notwendig ist.

Javawizard
quelle
Diese Antwort hat am Ende für mich funktioniert . Dumme Lösung für ein dummes Problem. Beachten Sie, dass das Launchpad tatsächlich einen Fehler aufweist. Sie können also gerne einen Beitrag leisten.
Jeff

Antworten:

8

Ist es eine Option, auf ein untergeordnetes Tool wie dpkg zurückzugreifen ?

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

Verwenden Sie zum Entfernen von Paketkonfigurationsdateien die folgende Bereinigung

dpkg --purge foo bar libperl-dev
barti_ddu
quelle
1
Ich hätte erwähnen sollen, dass die zu entfernenden Pakete umgekehrte Abhängigkeiten haben können, und ich möchte, dass diese auch entfernt werden. Apt-get ist daher viel besser als dpkg, aber ich werde Ihre Antwort akzeptieren, da es anscheinend keinen wirklich besseren Weg gibt, dies zu tun.
Javawizard
7

Ich benutze apt-get remove --purge(aka apt-get purge) für die folgende Abhängigkeit mit einer Liste von Paketen. Um nicht vorhandene Pakete zu verarbeiten, filtere ich Pakete heraus, die nicht mit dem folgenden Skript installiert wurden.

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
quelle
3

Für Debian ≤ 9 ist es möglich, nur zu verwenden aptitudeanstelle von apt-get:

sudo aptitude remove -y cups-dbg bogus-package

Aptitude druckt Warnungen aus, entfernt Ihre Pakete jedoch weiterhin:

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

Wenn Sie löschen (Paketkonfigurationsdateien löschen) möchten, anstatt sie zu entfernen (Konfigurationsdateien behalten), beachten Sie, dass aptitudenur die direkt angegebenen Pakete gelöscht werden, während die nicht verwendeten Abhängigkeiten nur entfernt werden. Sie können jedoch alle entfernten Pakete in einem zweiten Schritt löschen:

apt-get -y purge $(dpkg -l | grep ^rc | awk '{print $2}')
vog
quelle
in Ordnung. manchmal hatte der bogus-packageeinfach den falschen Namen. Wenn wir also 500 Pakete hatten, ist es besser, auch die gefälschten Pakete zu analysieren und einige Tricks auszuführen (z. B. Zahlen nach dem fehlenden Namen usw.). Können Sie uns bitte einige Hinweise dazu geben? ..
Nyxee
@nyxee Ich schlage vor, dies als neue Frage zu stellen und genau darauf hinzuweisen, was Sie erreichen möchten.
Vog
1
Dies wäre eine gute Problemumgehung, außer dass 1) aptitude unter Ubuntu 18.04 nicht mehr standardmäßig installiert ist und 2) aptitude eine ganz andere (man könnte sagen seltsame) Art des Umgangs mit Platzhaltern hat.
Jeff
Dies funktioniert nicht für mich auf Debian 10. Ich sehe,Couldn't find any package whose name or description matched 'QUX' Unable to apply some actions, aborting
pdoherty926
@ pdoherty926 Danke für den Hinweis. Ich habe dies überprüft und meine Antwort entsprechend angepasst.
Vog
0

Ein weiterer kleiner 2-Liner, wenn jemand apt verwenden muss:

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
}

Erklärung:

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
quelle
Willkommen bei SuperUser! Würden Sie Ihrer Antwort eine weitere Beschreibung hinzufügen, was Ihr Skript tut und wie es es tut?
El8dN8
@ El8dN8 Explination hinzugefügt
Meir