Безопасна ли эта команда для удаления старых ядер?

Просматривая в Интернете статьи об Ubuntu, я наткнулся на эту команду:

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

Автор сказал, что это однострочная команда, которая удалит все предыдущие версии Linux, оставив только текущая !

Я на самом деле ищу такую ​​команду, но я не уверен, насколько это безопасно. Я хотел бы знать:

  • Безопасно ли выполнять эту команду?
  • Как работает эта команда? то есть объяснение небольших частей такой большой команды
  • Если эта команда служит какой-то другой цели, то какой будет правильная команда для достижения того, что, как утверждает автор, она выполняет?

Я очень смущаюсь и расстраиваюсь, когда пытаюсь сделать вывод сам. Как эта команда работает для нее, содержит многочисленные символы /, |, \, * и ^, которые Google трудно понять.

Я ищу пошаговый перевод & amp; объяснение этой команды, которое я не смог найти в интернете!

21
задан 16 March 2013 в 16:30

4 ответа

Я запустил путем разделения команд, чтения man страница для каждого.

  • dpkg -l: перечислите pacakges, таким образом, dpkg -l linux-* перечислил бы все пакеты, которые запустились с linux- (обычно ядра).

  • sed: Вывод dpkg -l linux-* передается по каналу к sed с несколькими регулярными выражениями, который sed декодирует.

  • uname -r unameинформация о системе печати

uname - информация о системе печати

-r обработайте конкретно печатает выпуски ядра:

- r, - печать выпуска ядра выпуск ядра

Вывод uname -r затем передается по каналу к sed с более регулярными выражениями, вывод которых передается xargs

Так xargs переводит sed вывод в пакет называет и передает их на sudo apt-get purge -y который автоматически отвечает на 'да' на все подсказки:

- y, - да, - принимают - да Автоматический да к подсказкам; примите "да" как ответ на все подсказки и работайте нев интерактивном режиме. Если нежелательная ситуация, такая как изменение сохраненного пакета, попытка установить неаутентифицируемый пакет или удаление существенного пакета происходит затем склонная - добираются, прервется. Элемент конфигурации: APT:: Доберитесь:: примите - Да.

В целом кажется, что эта команда сделает то, что Вы хотите, хотя знать наверняка, что мы должны были бы перевести sedрегулярные выражения.

Я просто работал:

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

вот снимок экрана:

enter image description here

Все старые версии ядра iirc.

6
ответ дан 16 March 2013 в 16:30

Вы попросили пошаговое объяснение, поэтому здесь идет речь:

sudo dpkg -l 'linux-*'

Перечисляет пакеты, начинающиеся с linux- в имени пакета

| sed

, и направляет список в sed

"s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'

, который будет использовать очень сложное регулярное выражение для редактирования списка

| xargs

, который передаст новый список в xargs, который отправит его как аргумент

sudo apt-get -y purge

, который очистит эти пакеты, не давая вам возможности передумать.

1116 Или, может быть, точнее сказать, что он отправит этот список в команду очистки и оставит все как есть. Будет ли очищено что-либо или, что важно, точно , что очищено , зависит от выходных данных предыдущих команд.

Это безопасно? В этом случае все зависит от того, насколько хорошо автор поста, в котором вы его нашли, понимает регулярные выражения и синтаксис sed. И есть целые книги на обе эти темы.

0
ответ дан 16 March 2013 в 16:30

Я бы сказал: не используйте его в текущей форме

  1. Он вносит изменения, не спрашивая вас. Часть apt-get -y purge позволяет однострочнику начать выполнение пакетов очистки без вашего подтверждения. Если в скрипте существует какая-либо ошибка, вы можете быть ввернуты .

  2. Нет источника, автор не указан. Источник этого имеет значение здесь. В случае, если он будет получен из тщательно протестированного системного пакета, мы можем проследить, как на нем проводится тестирование. Из случайного источника мы не можем доверять этому.

  3. dpkg -l работает нормально без sudo. Я не понимаю, почему первоначальный автор считал это необходимым.

Используйте здравый смысл

Удалите вредные части и оставьте все, что работает от имени пользователя root.

Например, сократите это до:

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

, который просто только выводит материал и запускает с обычными правами пользователя . Как только вы согласитесь удалить эти ядра, вы можете добавить | xargs sudo apt-get purge самостоятельно. Это преднамеренно без опции -y, поэтому вам будет предложено подтвердить изменения, которые будут внесены в вашу систему.

Объяснение

  • dpkg -l Выводит список всех пакетов. В этом случае будут перечислены только пакеты , начиная с с именем linux-.
  • | (труба) направляет вывод команды слева (мы называем это stdout) на ввод команды справа (мы называем это stdin).
  • sed - это инструмент для управления строками с использованием регулярных выражений . В этом случае он управляет выводом команды слева от конвейера и фильтрует установленные пакеты (полагаясь на ii, как указано в dpkg). Это даже вложено в этом случае. Было бы слишком сложно объяснить все использование sed здесь, так как его использование очень сложно со сложными регулярными выражениями. (\(.*\)-\([^0-9]\+\)" является примером регулярного выражения.
  • Регулярные выражения очень широко используются для поиска совпадений на основе выражения, которое они представляют. \1 является ссылкой для замены своего рода универсальный поиск и замена (ссылаясь на первый «удар» с помощью 1). Регулярное выражение само по себе не может причинить вреда. Однако, если они манипулируют вводом неправильно, они могут заставить вас удаляйте неправильные пакеты или даже делайте инъекцию оболочки. В этом случае это выглядит как способ найти имя пакета ядра на основе версии, предоставленной uname -r.
  • uname -r выводит текущую версию ядро работает.
  • xargs добавляет строки ввода слева от канала в качестве аргументов команды.В этом случае версии ядра в каждой строке преобразуются в горизонтальный разделенный пробелами список и добавляются с помощью команды sudo apt-get.
  • sudo apt-get -y purge [packagename] удаляет (удаляет все) из заданных пакетов (в качестве аргументов).

Alter аборигены

Вероятно, об этом уже задавались некоторые вопросы. Соответствующие, которые я нашел до сих пор:

0
ответ дан 16 March 2013 в 16:30

Менее опасная версия этого скрипта, которая удаляет неиспользуемые и устаревшие совпадения ядер для rc в начале строки вывода dpkg вместо ii. (См. https://askubuntu.com/a/18807/220802 для объяснения этих флагов.) В моем случае это точно соответствует всем пакетам ядра, которые не защищены /etc/apt /apt.conf.d/01autoremove-kernels.

Например:

# sed -n '/to keep/,$p' /etc/apt/apt.conf.d/01autoremove-kernels
# Kernel versions list to keep:
5.4.0-58.64
5.4.0-60.67
# Kernel packages (version part) to protect:
5\.4\.0-58-generic
5\.4\.0-60-generic
*/

и

# dpkg -l 'linux-*' | sed '/^rc/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'
linux-image-5.3.0-18-generic
linux-image-5.3.0-19-generic
linux-image-5.3.0-45-generic
linux-image-5.4.0-21-generic
linux-image-5.4.0-26-generic
linux-image-5.4.0-28-generic
linux-image-5.4.0-31-generic
linux-image-5.4.0-33-generic
linux-image-5.4.0-40-generic
linux-image-5.4.0-42-generic
linux-image-5.4.0-48-generic
linux-image-5.4.0-52-generic
linux-image-5.4.0-53-generic
linux-image-5.4.0-56-generic
linux-modules-5.3.0-18-generic
linux-modules-5.3.0-19-generic
linux-modules-5.3.0-45-generic
linux-modules-5.4.0-21-generic
linux-modules-5.4.0-26-generic
linux-modules-5.4.0-28-generic
linux-modules-5.4.0-31-generic
linux-modules-5.4.0-33-generic
linux-modules-5.4.0-40-generic
linux-modules-5.4.0-42-generic
linux-modules-5.4.0-48-generic
linux-modules-5.4.0-52-generic
linux-modules-5.4.0-53-generic
linux-modules-5.4.0-56-generic
linux-modules-extra-5.3.0-18-generic
linux-modules-extra-5.3.0-19-generic
linux-modules-extra-5.3.0-45-generic
linux-modules-extra-5.4.0-21-generic
linux-modules-extra-5.4.0-26-generic
linux-modules-extra-5.4.0-28-generic
linux-modules-extra-5.4.0-31-generic
linux-modules-extra-5.4.0-33-generic
linux-modules-extra-5.4.0-40-generic
linux-modules-extra-5.4.0-42-generic
linux-modules-extra-5.4.0-48-generic
linux-modules-extra-5.4.0-52-generic
linux-modules-extra-5.4.0-53-generic
linux-modules-extra-5.4.0-56-generic

, которые вы можете передать в | xargs apt purge -y сейчас. Обратите внимание, что пропуск флага -y приведет к прерыванию операции.

Затем вы можете проверить каталог /boot на наличие остатков старых ядер. В моем случае было больше файлов, которые больше не отслеживались apt, которые были удалены с помощью ls /boot/*-5.4.0-{00..56}* 2>/ dev/null от всей души передается | xargs rm -rf.

0
ответ дан 13 January 2021 в 15:24

Другие вопросы по тегам:

Похожие вопросы: