Du bist nicht angemeldet.

#1 24.11.2019 15:59:03

df8oe
Mitglied

[gelöst] pacman -R

Hallo in die Community,

ich verwende Arch nun seit einem Jahr und beginne, die "komplizierteren" Sachen anzugehen wink Vorher habe ich über 10 Jahre mit Debian-basierten Distris gearbeitet und der endgültige Skill für Arch muss nun angegangen werden...

Aktuell habe ich folgendes Problem:

Ich möchte scriptgesteuert viele Pakete deinstallieren. Es ist nicht sichergestellt, dass auch tatsächlich jedes Paket auf dem jeweiligen System installiert ist.

Ein

pacman -R paket1 paket2 paket3 paket4 paket5 paket6 ...

scheitert in so einem Fall mit "paketx kann nicht deinstalliert werden" - mit der unerwünschten Nebenwirkung, dass alle anderen Pakete ebenfalls nicht deinstalliert werden.

Also habe ich die Pakete alle in ein Array gepackt und bin das Array schrittweise durchgegangen. Das klappt schon besser - aber auch noch nicht so wie erwünscht. Manche Deinstallationen gelingen nur, wenn man zwei Pakete auf einmal deinstalliert (wegen Abhängigkeiten). Solche abhängigen Pakete bleiben bei diesem Verfahren über.

Gibt es einen Parameter für pacman, der nicht vorhandene Pakete einfach überspringt und den Rest deinstalliert? Ich bin im WIKI nicht fündig geworden, und auch die Manpage hat mich nicht schlau dazu gemacht. Bin daher für jeden Tipp dankbar!

LG
df8oe

Beitrag geändert von df8oe (24.11.2019 18:26:35)

Offline

#2 24.11.2019 16:34:27

brikler
Mitglied

Re: [gelöst] pacman -R

eine hilfreiche sache:

man pacman

https://wiki.archlinux.org/index.php/Pacman/Rosetta

Beitrag geändert von brikler (24.11.2019 16:36:10)

Offline

#3 24.11.2019 17:52:53

df8oe
Mitglied

Re: [gelöst] pacman -R

Hallo brikler,

bitte Frage durchlesen bevor Du antwortest: Ich schrieb dort bereits dass "man" und das WIKI mir nicht geholfen haben.

man pacman | grep skip --> keine Antwort auf meine Frage
man pacman | grep stop --> keine Antwort auf meine Frage
man pacman | grep ignore --> keine Antwort auf meine Frage
Auch eine Suche über die von Dir genannte Seite brachte ebenfalls keine Antwort auf meine Frage.

Beitrag geändert von df8oe (24.11.2019 17:54:49)

Offline

#4 24.11.2019 18:17:36

GerBra
Mitglied

Re: [gelöst] pacman -R

df8oe schrieb:

Gibt es einen Parameter für pacman, der nicht vorhandene Pakete einfach überspringt und den Rest deinstalliert?

Mir wäre nichts bekannt. Ein pacman -R geht halt davon aus, Pakete zu deinstallieren die auch installiert sind, also bei pacman -Q auftauchen.

Ein möglicher Ansatz wäre, dein Array mit Paketen (Liste x) am jeweiligen System mit der Ausgabe von pacman -Qq (Liste y) zu vergleichen. Und dann ein neues Array zu verwenden, welches nur Pakete enthält die sowohl in Liste x als auch in y drin sind. Damit dann pacman -R "füttern".
Bzgl. Abhängigkeiten: Evtl. wäre es besser, in den Listen nur explizit installierte Pakete (pacman -Qeq) zu verwenden und die Frage der (De)installation von evtl. Abhängigkeiten dann pacman -R(Optionen) zu überlassen.

Offline

#5 24.11.2019 18:26:13

df8oe
Mitglied

Re: [gelöst] pacman -R

Danke GerBra,

ich hatte es schon fast befürchtet dass es keinen solchen Parameter gibt (das wäre vielleicht eine Enhancement-Bitte an die Maintainer...). Die Idee vor dem Aufruf das Array auf nicht existierende Pakete zu überprüfen ist sehr gut. Auf die paar Sekunden Verzögerung kommt es nicht an!

Offline

#6 24.11.2019 19:01:27

wirr
Mitglied

Re: [gelöst] pacman -R

df8oe schrieb:

Auf die paar Sekunden Verzögerung kommt es nicht an!

Wie meinst du das? Der Vorgang dauert aufgerundet 0.01 Sekunden:

pacman -Qi $(pacman -Qq glibc nichtexistent bash vim-runtime)  0.01s user 0.02s system 97% cpu 0.022 total

Offline

#7 24.11.2019 19:41:02

GerBra
Mitglied

Re: [gelöst] pacman -R

df8oe schrieb:

ich hatte es schon fast befürchtet dass es keinen solchen Parameter gibt (das wäre vielleicht eine Enhancement-Bitte an die Maintainer...).

Hier liest sicher keiner der pacman-Entwickler mit, wenn es dir wichtig wäre schreibe einen Bug-/Feature-Report zu pacman im Bugtracker.

@wirr
Bei deinem Beispiel würde eine Deinstallation aber immer noch an der weiterhin existierenden Fehlermeldung scheitern:

$ pacman -Rp $(pacman -Qq mc nnn)
Fehler: Paket 'nnn' wurde nicht gefunden
mc-4.8.23-1

#besser IMHO
$ pacman -Rp $(pacman -Qq mc nnn 2>/dev/null)
mc-4.8.23-1

Ein Ansatz so für den OP wäre ggf:

$ cat big
mc
nnn

$ pacman -Rp $(cat big | pacman -Qq - 2>/dev/null)
mc-4.8.23-1

Würde also aus der "großen" Liste big nur die Pakete deinstallieren, die auch vorhanden sind. Ist allerdings IMHO sehr unsauber und ggf. risikobehaftet.

Ich würde wohl eher mit einer Paketliste und Arrays arbeiten, also versuchen bei pacman mit so wenig (auch unterdrückten) Fehlermeldungen auszukommen. Also das Array so aufzubereiten daß der lokale pacman zufrieden ist.
Ansatz (mit ruby, wg. einfacher Array-Behandlung):

$ ruby -e "puts IO.popen('pacman -Ssq').readlines & IO.popen('pacman -Qq').readlines"

Beide popen-Aufrufe erzeugen jeweils ein Array, aus diesen wird durch "&" ein neues Array erzeugt welches (unique) nur die Elemente enthält die in *beiden* Arrays vorhanden sind.
Daraus ließe sich dann als Ansatz folgender Einzeiler machen:

$ cat big
mc
nnn
zim
zom

$ pacman -Rp $(ruby -e "puts IO.popen('cat big').readlines & IO.popen('pacman -Qq').readlines")
zim-0.72.0-2
mc-4.8.23-1

Würde also aus der großen Liste (big) nur die Pakete an pacman -R übergeben, die auch auf dem System installiert sind. Hier also nur den mc und zim deinstallieren, den nnn und zom habe ich nicht.

Offline

Schnellantwort auf dieses Thema

Schreibe deinen Beitrag und versende ihn
Deine Antwort

Fußzeile des Forums