Was bewirkt dieser „apt-get remove“-Befehl?

Was bewirkt dieser „apt-get remove“-Befehl?

Was macht der folgende Code?

Ich habe es im Internet gefunden, also habe ich es kopiert und in das Terminal eingefügt, aber als ich einen neuen Kernel installiert habe, wurde nur der alte erkannt.

sudo apt-get remove --purge $(dpkg -l 'linux-image-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d')

Antwort1

Lassen Sie uns den Code nacheinander aufschlüsseln (für mein System):

$ dpkg -l 'linux-image-*'
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                          Version             Architecture        Description
+++-=============================-===================-===================-================================================================
un  linux-image-3.0               <none>              <none>              (no description available)
ii  linux-image-3.13.0-32-generic 3.13.0-32.57        amd64               Linux kernel image for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-extra-3.13.0-32-g 3.13.0-32.57        amd64               Linux kernel extra modules for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-generic           3.13.0.32.38        amd64               Generic Linux kernel image


$ dpkg -l 'linux-image-*' | sed '/^ii/!d'
ii  linux-image-3.13.0-32-generic                         3.13.0-32.57                                        amd64        Linux kernel image for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-extra-3.13.0-32-generic                   3.13.0-32.57                                        amd64        Linux kernel extra modules for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-generic                                   3.13.0.32.38                                        amd64        Generic Linux kernel image


$ uname -r | sed 's/\(.*\)-\([^0-9]\+\)/\1/'
3.13.0-32



$ dpkg -l 'linux-image-*' | sed '/^ii/!d' | sed "/$(uname -r | sed 's/\(.*\)-\([^0-9]\+\)/\1/')/d"
ii  linux-image-generic                                   3.13.0.32.38                                        amd64        Generic Linux kernel image



$ dpkg -l 'linux-image-*' | sed '/^ii/!d' | sed "/$(uname -r | sed 's/\(.*\)-\([^0-9]\+\)/\1/')/d" | sed 's/^[^ ]* [^ ]* \([^ ]*\).*/\1/'
linux-image-generic



$ dpkg -l 'linux-image-*' | sed '/^ii/!d' | sed "/$(uname -r | sed 's/\(.*\)-\([^0-9]\+\)/\1/')/d" | sed 's/^[^ ]* [^ ]* \([^ ]*\).*/\1/' | sed '/[0-9]/!d'
## No output

Das hier würde also nichts bewirken:

$ sudo apt-get remove --purge $(dpkg -l 'linux-image-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d')

Wie du sehen kannstes war kurz davor, mein aktuelles Kernel-Metapaket zu entfernen linux-image-generic 3.13.0.32.38 amd64 Generic Linux kernel image(dank dieser letzten sed '/[0-9]/!d'Zeile), was falsch ist.

Kurz gesagt, dieser Teil sedhat mehrere Probleme. Sie sollten es vermeiden, Ihre älteren Kernel zu entfernen.

BEARBEITEN:

Ich habe bereits gesagt, dass der sedBefehl Probleme hat. Der Erweiterung halber werde ich die letzten beiden Zeilen des Formulars entfernen, die in meinem aktuellen Szenario eigentlich funktionieren sollten.

Die letzten beiden Zeilen in abgewandelter Form:

sed -r 's/^[^ ]* *(([a-z]|-)*)(-[a-z]*) *(([0-9]|-)*)\..*/\1-\4\3/'

Also:

$ dpkg -l 'linux-image-*' | sed '/^ii/!d;/'"$(uname -r | 
sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d' | 
sed -r 's/^[^ ]* *(([a-z]|-)*(-[a-z]*) *(([0-9]|\.|-)*)\..*/\1\-\4\3/'

Ausgabe:

linux-image-3.13.0.32-generic

Das ist sehr gefährlich!!

Um nun zu zeigen, was dies mit meinem System machen würde, --dry-runverwenden wir den vollständigen apt-get removeBefehl:

$ sudo apt-get remove --dry-run $(dpkg -l 'linux-image-*' | 
sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d' | 
sed -r 's/^[^ ]* *(([a-z]|-)*)(-[a-z]*) *(([0-9]|\.|-)*)\..*/\1\-\4\3/')


Reading package lists... Done
Building dependency tree       
Reading state information... Done
Note, selecting 'linux-image-3.13.0-32-generic' for regex 'linux-image-3.13.0.32-generic'
The following package was automatically installed and is no longer required:
  linux-headers-generic
Use 'apt-get autoremove' to remove it.
The following packages will be REMOVED:
  linux-generic linux-image-3.13.0-32-generic
  linux-image-extra-3.13.0-32-generic linux-image-generic
0 upgraded, 0 newly installed, 4 to remove and 0 not upgraded.
Remv linux-generic [3.13.0.32.38]
Remv linux-image-generic [3.13.0.32.38]
Remv linux-image-extra-3.13.0-32-generic [3.13.0-32.57]
Remv linux-image-3.13.0-32-generic [3.13.0-32.57]

Wie Sie sehen, werden alle meine aktuellen Kernel entfernt. Beachten Sie auch, dass dies nur eine Simulation ist, die meinem aktuellen Szenario entspricht, und das Original sedkann verbessert werden.

** Beachten Sie, dass der eigentliche Code funktioniert, wenn Sie rebootnach dem Kernel-Upgrade Folgendes tun:Oli hat es schon erwähnt.

EDIT2:

Hier ist ein einfaches, aber robustes Skript, das alle Situationen berücksichtigt und die tatsächlich älteren Kernel entfernt:

#!/bin/bash
kernels=( $(grep -Po "^linux-image-[^-]+-[^-]+-generic\b" < <(dpkg --get-selections)) )
cur_rel=$(grep -Po ".*(?=-[a-z]*$)" < <(uname -r))

for kernel in "${kernels[@]}"; do
    ker_rel=$(grep -Po "[0-9].*(?=-[a-z]*)" <<< "$kernel")
    dpkg --compare-versions "$ker_rel" gt "$cur_rel" && { echo "Please Restart your computer first"; break; }
    dpkg --compare-versions "$ker_rel" lt "$cur_rel" && sudo apt-get remove "$kernel"
done

Wenn Sie eine neuere Version als die aktuelle haben, erhalten Sie eine Warnung, dass Sie Ihren Computer zuerst neu starten müssen. Beachten Sie auch, dass die älteren Kernel aus gutem Grund erhalten bleiben: Wenn Sie Ihren aktuellen Kernel irgendwie durcheinanderbringen und Ihr System dadurch instabil wird, sollten Sie in der Lage sein, jeden älteren Kernel zu booten.

Antwort2

Dies ist ein Versuch, Kernel zu entfernen, die nicht der aktuelle sind.

Es gibt viele Code-Schnipsel, die so etwas machen unddas ist kein gutes Beispiel. Es könnte problemlos neuere Kernel als die aktuellen und damit auch das Metapaket entfernen, das ( linux-genericetwa) installiert wird, wenn Sie ein Upgrade durchgeführt und keinen Neustart durchgeführt haben.

verwandte Informationen