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

21

Просматривая в Интернете статьи об 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 для.

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

Бхавеш Диван
источник
1
Это не та команда, которую вы цитируете, но я использовал команду на tuxtweaks.com/2010/10/… для удаления старых ядер без каких-либо проблем. Эта страница также объясняет, что делает команда.
user68186
4
@UriHerrera apt-get autoremoveне предлагает для меня удаления старых версий ядра. Если я не удаляю их, они просто будут накапливаться, пока у меня не /bootбудет свободного места и обновления не будут выполнены. У вас есть ссылка на это о том, что он должен сделать это?
gertvdijk
1
Это делает для меня всякий раз, когда есть новое обновление для ядра, он говорит, что следующие пакеты и т. Д. Больше не требуются, и он перечисляет предыдущее ядро, которое у меня было.
Ури Эррера
Мой ответ был удален модератором, поэтому я комментирую здесь: см. Эту статью для объяснения сценария. Я не понимаю, почему одна часть сценария s/^[^ ]* [^ ]* \([^ ]*\).*/\1/вместо простой s/^[^ ]* \([^ ]*\).*/\1/. Сценарий не очень надежный или элегантный. Например, зачем проверять текущее ядро ​​перед извлечением имени пакета из вывода? Что касается альтернативы, sudo apt-get autoremove --purgeочищает большинство старых ядер в некоторых последних версиях Ubuntu, таких как Xubuntu 15.10.
Ярно

Ответы:

27

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

  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] удаляет (удаляет все) из указанных пакетов (в качестве аргументов).

альтернативы

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

gertvdijk
источник
1
каков должен быть разрыв страшно выглядящего узла этой команды, который выглядит примерно так /(.*)-([^0-9]\+)/\1/")"'/d;s/^[^ ] * [^] * ([^] *). * / \ 1 /; /
Бхавеш Диван
будет ли указанная выше команда в этом ответе изящно очищать старые ядра ?? или все же apt-get лучше автоматически удалить?
Бхавеш Диван
4
@ Z9iT Это регулярные выражения. Они используются для поиска совпадений на основе выражения, которое они представляют, и \1является элементом управления заменой для универсального поиска и замены. Для удаления любого пакета я ясно выразил свой ответ (будучи моим мнением): используйте здравый смысл. Не позволяйте сценарию вносить изменения в вашу систему автоматически. Проверьте, что он будет делать. Всегда.
gertvdijk
Альтернатива, которую вы используете, не удаляет соответствующие пакеты заголовков linux.
Ярно
Затем просто выполните автоматическое удаление apt-get, которое должно обнаружить, что эти заголовки больше не нужны.
Бен-Набий Деруш
7

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

sudo dpkg -l 'linux-*'

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

| sed

и передать список в sed

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

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

| xargs

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

sudo apt-get -y purge

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

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

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

chaskes
источник
6

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

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

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

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

uname - печатать системную информацию

-rРучка специально печатает ядра релизов:

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

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

Таким образом, xargsпреобразовывает sedвыходные данные в имена пакетов и передает их, sudo apt-get purge -yкоторые автоматически отвечают «да» на все запросы:

-y, --yes, --assume-yes Автоматически да на запросы; примите «да» в качестве ответа на все запросы и неинтерактивно. Если возникает нежелательная ситуация, например, изменение задержанного пакета, попытка установить неаутентифицированный пакет или удаление необходимого пакета, то apt-get прервет работу. Элемент конфигурации: APT :: Get :: Assume-Yes.

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

Я только что побежал:

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

вот скриншот:

введите описание изображения здесь

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

Сет
источник
какая тренировка для перевода выражения этого седа?
Бхавеш Диван
2
Я пытаюсь понять это прямо сейчас, может занять некоторое время;)
Сет
Смотри мой ответ .
Ярно
@ Z9iT Мне было лень копировать объяснение сценария из связанной статьи в ответ, так что я думаю, именно поэтому Сет удалил мой ответ. Но я думаю, что связанная статья - это то, что вы искали в Интернете. Я также сказал вам более безопасный способ удаления старых ядер, хотя он сохраняет 2-3 ядра на всякий случай и может пока не работать во всех текущих версиях Ubuntu.
Ярно
@jarno Я удалил его, потому что Z9iT спрашивал о конкретной команде, а не о безопасном способе удаления старых ядер. Это все еще может быть актуально, но в комментарии, а не в ответе :) (как и вы)
Сет