Просматривая в Интернете статьи об 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; объяснение этой команды, которое я не смог найти в интернете!
Я запустил путем разделения команд, чтения 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'
вот снимок экрана:
Все старые версии ядра iirc.
Вы попросили пошаговое объяснение, поэтому здесь идет речь:
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
. И есть целые книги на обе эти темы.
Он вносит изменения, не спрашивая вас. Часть apt-get -y purge
позволяет однострочнику начать выполнение пакетов очистки без вашего подтверждения. Если в скрипте существует какая-либо ошибка, вы можете быть ввернуты .
Нет источника, автор не указан. Источник этого имеет значение здесь. В случае, если он будет получен из тщательно протестированного системного пакета, мы можем проследить, как на нем проводится тестирование. Из случайного источника мы не можем доверять этому.
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]
удаляет (удаляет все) из заданных пакетов (в качестве аргументов). Вероятно, об этом уже задавались некоторые вопросы. Соответствующие, которые я нашел до сих пор:
Из этого ответа [ 1127], следующая команда, кажется, делает то же самое гораздо безопаснее и чаще:
sudo apt-get purge $( dpkg --list | grep -P -o "linux-image-\d\S+" | grep -v $(uname -r | grep -P -o ".+\d") )
Менее опасная версия этого скрипта, которая удаляет неиспользуемые и устаревшие совпадения ядер для 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
.