此“ apt-get remove”指令有什么作用?


10

以下代码做什么?

我在互联网上找到了它,所以我将其复制并粘贴到终端中,但是当我安装新内核时,它只能检测到旧内核。

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')

第二部分是一个正则表达式,用于定义文件名的外观,但不完全是文件名。它是安装您的目标内核还是要找出该命令要删除的确切内容?
Niklas Lindskog 2015年

此代码将不会安装任何内核,但是删除!我看不到这个sed-command到底能做什么,但是它处理的输出dpkg -l 'linux-image-*',该输出 列出了所有已安装的内核软件包,并过滤掉其中的一些以供删除apt-get remove
字节指挥官

16
一个很好的经验法则:如果您不知道某个代码的用途,请不要将该代码放入Terminal,直到知道该代码的作用的人告诉您。如果您想获取最新的内核,则可能需要查看askubuntu.com/questions/119080/…而不是使用您不了解的代码。
Trogdor上校,2015年

坐在磁盘上的旧内核不会造成任何麻烦,除了占用磁盘空间和使update-grub(程序包发布)速度变慢之外。如果你担心,你实际上并没有引导你试图升级到内核,然后运行uname -a,甚至dmesg | less
彼得·柯德斯

7
“我在互联网上找到了它,所以我将其复制并粘贴到终端中” NO NO NO NO NO。您最终会意外地做可怕的事情。运行您不理解的代码会导致可怕的事情,例如破坏您的系统,踢小狗。
Journeyman Geek 2015年

Answers:


12

让我们一一破解代码(对于我的系统):

$ 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

因此,这无能为力:

$ 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')

如您所见,这非常接近删除我当前的内核meta包 linux-image-generic 3.13.0.32.38 amd64 Generic Linux kernel image(由于最后sed '/[0-9]/!d'一行),这是错误的。

简而言之,这sed有几个问题。您应该避免使用它来删除较旧的内核。

编辑:

我已经说过该sed命令有问题。为了扩展起见,我将删除最后两行,其形式实际上应该适用于当前情况。

最后两行采用修改后的形式:

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

所以:

$ 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/'

输出:

linux-image-3.13.0.32-generic

多数民众赞成在非常危险!

现在显示--dry-run完整的apt-get remove命令,这将对我的系统产生影响:

$ 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]

如您所见,它将删除我所有的当前内核,还请注意,这只是一个模拟,可以匹配我当前的情况,并且sed可以对原始情况进行改进。

**请注意,如果rebootOli前面提到的那样在内核升级之后进行,则实际代码将起作用。

编辑2:

这是一个简单而健壮的脚本,它将考虑所有情况并删除实际的旧内核:

#!/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

如果您使用的版本比当前版本新,这将向您发出警告,请先重新启动计算机。还要注意,保留旧内核是有充分的理由的,这是一个很好的理由,如果您以某种方式弄乱了当前内核,使系统不稳定,那么您应该能够启动到任何旧内核中。


嗯,等等,什么?您用其他您认为“实际上应该(!!)在那里”的代码替换原始的工作代码,观察到您的“固定”代码已损坏,并且会删除当前的内核,因此得出结论,原始代码为“很杂种!”?WTF?-1。
Ilmari Karonen 2015年

正如在Oli的答案中指出的那样,肯定有合理的理由来批评原始代码,并且我相信sed代码可以变得更健壮。但是事实仍然是,在正常情况下(例如,您在上一次内核升级后重新启动),原始代码有效,而修改后的版本则无效。
Ilmari Karonen 2015年

1
首先,您不应该使用所用的最后一个单词。现在,您是否实际运行了实际的代码?删除apt-get零件,您得到了什么输出?
heemayl

@IlmariKaronen:嗯,我第二次与你在某些方面,我已经修改了答案..
heemayl

为什么,是的,我确实(([a-z]|-)*没有apt-get批评您的部分的情况下运行了您的修改后的命令(该版本不会因缺少括号后而崩溃)。在我的系统,它输出以下行:linux-image-3.13-linux-image-3.13-linux-image-extra-3.13-linux-image-extra-3.13-linux-image-3.13.0.49-generic。那真的是您想要的吗?(此外,如果您能算出我实际安装了哪些内核,还可以加分。)
Ilmari Karonen 2015年

12

这是一种删除不是当前内核的工作。

那里有很多代码可以做这样的事情,这不是一个好例子linux-generic如果您进行了升级并且没有重新启动,它可以轻松地删除比当前版本新的内核,因此可以安装(等)的元软件包。


2
这根本不是一个好主意。这些旧内核是出于某种原因保留的,默认情况下只有2个旧内核,而当前只有1个旧内核。
Barafu Albino 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.