以下是我谷歌搜索后发现的:
dpkg --list 'linux-image-*' \
| perl -ane 'BEGIN { $r = `uname -r` or die; chomp $r } print $F[1], "\n" if $F[0] eq "ii" && $F[1] !~ /\Q$r\E\b/' \
| xargs -r aptitude purge -y
有人可以将上述三行合并为一行吗?我发现将一行复制并粘贴到 sudo 命令中比每次一行复制三行更容易。
对于豪克包胶:我编辑了这篇原始文章,以包含当我尝试按照 sudo 命令一次复制三个分割线时的错误消息:
username@hostname:~$ sudo -i
[sudo] password for username:
root@hostname:~# dpkg --list '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-2. <none> (no description available)
un linux-image-2. <none> (no description available)
un linux-image-2. <none> (no description available)
un linux-image-2. <none> (no description available)
ii linux-image-3. 3.14.4-1~bpo amd64 Linux 3.14 for 64-bit PCs
ii linux-image-3. 3.2.57-3+deb amd64 Linux 3.2 for 64-bit PCs
ii linux-image-am 3.14+57~bpo7 amd64 Linux for 64-bit PCs (meta-packag
root@hostname:~# | perl -ane 'BEGIN { $r = `uname -r` or die; chomp $r } print $F[1], "\n" if $F[0] eq "ii" && $F[1] !~ /\Q$r\E\b/' \
-bash: syntax error near unexpected token `|'
root@hostname:~#
root@hostname:~# | xargs -r aptitude purge -y
答案1
没有必要从这三行中选出一行。如果换行符被 转义,shell 会删除它\
。换句话说:带有三行此类参数的命令只能“看到”一行,而不是三行。
下一个问题是:
sudo cmd1 | cmd2 | cmd3
导致仅以cmd1
root 身份运行。你可以做类似的事情
sudo bash -c 'cmd1 | cmd2 | cmd3'
但这可能会引起引用烦恼。
最简单的解决方案可能是:创建一个空文件,将三行复制到其中,然后运行它:
sudo bash file
用于|
安全换行
您可以将 放在|
行尾。这样,(额外的)换行符就不会出现问题。尝试这个:
dpkg --list 'linux-image-*' |
perl -ane 'BEGIN { $r = `uname -r` or die; chomp $r } print $F[1], "\n" if $F[0] eq "ii" && $F[1] !~ /\Q$r\E\b/' |
sudo xargs -r aptitude purge -y
答案2
反斜杠换行符是一种在语法通常不允许换行的地方分割行的方法,因此您可以将其删除。
dpkg --list 'linux-image-*' | perl -ane 'BEGIN { $r = `uname -r` or die; chomp $r } print $F[1], "\n" if $F[0] eq "ii" && $F[1] !~ /\Q$r\E\b/' | xargs -r aptitude purge -y
如果你想在 sudo 下运行它,你不能只是复制粘贴该行sudo
,因为只有该dpkg
命令才能以 root 身份运行。其实只aptitude
需要以root身份运行即可。
dpkg --list 'linux-image-*' | perl -ane 'BEGIN { $r = `uname -r` or die; chomp $r } print $F[1], "\n" if $F[0] eq "ii" && $F[1] !~ /\Q$r\E\b/' | xargs -r sudo aptitude purge -y
该命令的功能过于复杂。 perl 脚本会过滤一些已安装的软件包,但 aptitude 完全有能力执行该过滤。
sudo aptitude purge -y "~i ^linux-image !?exact-name(linux-image-$(uname -r))"
答案3
您也可以创建一个函数(见下文)。
您可以将其放入一个文件中,例如~/MyPersonalFunctions
,您将在其中添加您需要使用的所有功能。
您可以仅在需要时使用命令加载它source ~/MyPersonalFunctions
,并且您将拥有扩展的功能集。
您甚至可以在每次自动写入source ~/MyPersonalFunctions
文件时加载它~/.bashrc
。
注意:您必须写入放置此文件的完整路径。例如,如果您将其放入~/bin
目录中,您将编写source ~/bin/MyPersonalFunctions
)。
function PurgeKernels()
{
dpkg --list 'linux-image-*' \
| perl -ane 'BEGIN { $r = `uname -r` or die; chomp $r } print $F[1], "\n" if $F[0] eq "ii" && $F[1] !~ /\Q$r\E\b/' \
| xargs -r sudo aptitude purge -y
}
function Cat(){ # Just to show you can put in the same file
echo Meow # more than one function... :-)
}
当然,您可以将其与本页其他答案提出的代码的较短版本一起使用。