En parcourant Internet pour trouver des articles sur Ubuntu, je suis tombé sur cette commande:
Sudo dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | xargs Sudo apt-get -y purge
L'auteur a déclaré qu'il s'agissait d'une commande d'une seule ligne qui supprimera toutes les versions précédentes de Linux, ne laissant que la version actuelle!
En fait, je cherche une telle commande, mais je ne suis pas sûr de la sécurité de la situation. J'aimerais savoir:
Je deviens très confus et frustré lorsque j'essaie de déduire par moi-même. En quoi cette commande fonctionne-t-elle? Elle contient de nombreux caractères /
, |
, \
, *
et ^
qui sont difficiles à utiliser pour Google.
Je cherche une traduction étape par étape et une explication pour cette commande que je n'ai pas pu trouver sur Internet!
Cela fait des changements sans vous demander. La partie apt-get -y purge
permet à one-liner de commencer à exécuter les packages de purge, sans votre confirmation. Si une erreur dans le script existe, alors vous pourriez être vissé .
Aucune source, aucun auteur donné. La source en fait une différence ici. Dans le cas où cela proviendrait d'un package système soigneusement testé, nous pourrons y retrouver les tests effectués. D'une source aléatoire, nous ne pouvons pas lui faire confiance.
dpkg -l
fonctionne correctement sans Sudo
. Je ne vois pas pourquoi l'auteur original a pensé que c'était nécessaire.
Supprimez les parties nuisibles et laissez de côté tout ce qui fonctionne en tant que root.
Par exemple, réduisez-le à ceci:
dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'
qui ne fait que uniquement des sorties et s'exécute avec des autorisations utilisateur normales . Une fois que vous acceptez de supprimer ces noyaux, vous pouvez ajouter | xargs Sudo apt-get purge
vous-même. C'est sans l'option -y
intentionnellement, il vous sera donc demandé de confirmer les modifications sur le point d'être apportées à votre système.
dpkg -l
Affiche la liste de tous les packages. Dans ce cas, seuls les paquets commençant par portant le nom linux-
seront listés.|
(un tuyau) dirige la sortie de la commande de gauche (nous appelons cela stdout
) vers l'entrée de la commande de droite (nous appelons cela stdin
).sed
est un outil permettant de manipuler des chaînes à l'aide d'expressions régulières . Dans ce cas, il manipule la sortie de la commande située à gauche du tube et filtre les paquetages installés (en utilisant le paramètre ii
donné par dpkg
). Il est même imbriqué dans ce cas. Il serait trop difficile d'expliquer l'utilisation de sed
dans son ensemble, car son utilisation est très compliquée avec les expressions régulières complexes. (\(.*\)-\([^0-9]\+\)"
est un exemple d'expression régulière.\1
est la référence de remplacement permettant d'effectuer une sorte de recherche/remplacement universel (faisant référence au premier "hit" avec 1
). L'expression régulière elle-même ne peut pas nuire. Toutefois, s’ils manipulent l’entrée de manière erronée, ils peuvent vous demander de supprimer les mauvais packages ou même d’injecter Shell. Dans ce cas, cela ressemble à un moyen de trouver le nom du paquet du noyau basé sur la version fournie par uname -r
.uname -r
affiche la version actuelle du noyau en cours d'exécution.xargs
ajoute les lignes de l'entrée à gauche du tube en tant qu'arguments de la commande. Dans ce cas, les versions du noyau de chaque ligne sont converties en une liste horizontale séparée par des espaces et ajoutées à la commande Sudo apt-get
.Sudo apt-get -y purge [packagename]
purge (supprime tout) les packages donnés (en tant qu'arguments).Quelques questions sont probablement déjà posées à ce sujet. Ceux que j'ai trouvés jusqu'à présent:
De cette réponse , la commande suivante semble faire la même chose d'une manière beaucoup plus sûre et plus courante:
Sudo apt-get purge $( dpkg --list | grep -P -o "linux-image-\d\S+" | grep -v $(uname -r | grep -P -o ".+\d") )
Vous avez demandé une explication étape par étape, alors voici:
Sudo dpkg -l 'linux-*'
Liste les paquets commençant par linux-
dans le nom du paquet
| sed
et canaliser la liste dans sed
name__
"s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'
qui utilisera une expression régulière très compliquée pour éditer la liste
| xargs
qui dirigera la nouvelle liste dans xargs
name__, qui l'enverra en tant qu'argument à
Sudo apt-get -y purge
ce qui va purger ces paquets sans vous donner une chance de changer d'avis.
Ou peut-être est-il plus exact de dire qu'il enverra cette liste dans la commande de purge et en restera là. Que quelque chose soit ou non purgé - et surtout - exactement ce qui est purgé dépend de la sortie des commandes précédentes.
Est-ce sûr? Dans ce cas, tout dépend de la manière dont l'auteur du message où vous l'avez trouvé comprend les expressions régulières et la syntaxe sed
name__. Et il existe des livres entiers sur ces deux sujets.
J'ai commencé par disséquer les commandes, en lisant la page man
pour chacune.
dpkg -l
: list les paquets, donc dpkg -l linux-*
listera tous les paquets qui ont commencé avec linux-
(généralement des noyaux).
sed
: La sortie de dpkg -l linux-*
est reliée à sed
avec plusieurs expressions régulières que sed
décode.
uname -r
uname
prints informations système
uname - affiche les informations du système
Le -r
imprime spécifiquement les versions du noyau:
-r, --kernel-release affiche la version du noyau.
La sortie de uname -r
est ensuite redirigée vers sed
avec plus d'expressions régulières, dont la sortie est passée à xargs
Donc, xargs
traduit la sortie sed
en noms de paquet et les transmet à Sudo apt-get purge -y
qui répond automatiquement par "oui" à toutes les invites:
-y, --oui, --assume-yes Automatique oui à l'invite; supposez "oui" comme réponse à toutes les invites et exécutez-le de manière non interactive. Si une situation indésirable, telle que la modification d'un paquet en attente, l'installation d'un paquet non authentifié ou la suppression d'un paquet essentiel, se produit, apt-get sera abandonné. Élément de configuration: APT :: Get :: Assume-Yes.
Globalement, il semble que cette commande va fasse ce que vous voulez, bien que pour savoir avec certitude nous devions traduire les expressions régulières de sed
.
Je viens de courir:
dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'
voici une capture d'écran:
Toutes les anciennes versions du noyau iirc.