Parece bom o suficiente, apenas alguns comentários. Os dois primeiros comentários tornam o comando mais seguro, enquanto o terceiro e o quarto tornam-no um pouco mais curto. Sinta-se à vontade para seguir ou ignorar qualquer um deles. Embora eu recomende strongmente seguir os dois primeiros. Você quer ter certeza de que é o mais seguro possível. Eu quero dizer seriamente. Você está jogando um sudo apt-get -y purge
em alguma lista de pacotes gerados automaticamente. Isso é tão mal ! :)
-
Listar todo o
linux-*
vai te dar muitos falsos positivos, como (exemplo da minha saída)linux-sound-base
. Mesmo que estes possam ser filtrados mais tarde pelo resto do seu comando, eu pessoalmente me sentiria mais seguro não listá-los em primeiro lugar. Melhor controlar quais pacotes você deseja remover. Não faça coisas que possam ter resultados inesperados. Então eu começaria comdpkg -l linux-{image,headers}-*
-
Seu regex para "listar apenas os que têm números" é um pouco simples demais na minha opinião. Por exemplo, existe o pacote
linux-libc-dev:amd64
quando você está em um sistema de 64 bits. Seu regex vai corresponder. Você não quer que combine. Evidentemente, se você seguiu meu primeiro conselho, entãolinux-libc-dev:amd64
não será listado de qualquer maneira, mas ainda assim. Sabemos mais sobre a estrutura de um número de versão do que o simples fato de que "há um número". Além disso, geralmente é uma boa ideia citar regexes, apenas para evitar possíveis erros de interpretação pelo shell. Então eu faria o comando egrepegrep '[0-9]+\.[0-9]+\.[0-9]+'
-
Depois, há essa coisa de classificação. Por que você classifica? Como você removerá todos os kernels (exceto o atual), é importante para você remover os kernels antes dos mais novos? Eu não acho que faça alguma diferença. Ou você está apenas fazendo isso, então você pode usar
sed
para "Imprimir apenas os resultados que vão depois do kernel atual"? Mas IMO isso parece muito complicado. Por que não simplesmente filtrar os resultados correspondentes ao seu kernel atual, como você já está fazendo comgrep -v
, e pronto? Honestamente, se eu pegar a primeira parte do seu comando (com minhas duas sugestões anteriores integradas), na minha máquina eu recebo$ dpkg -l linux-{image,headers}-* | awk '/^ii/{print $2}' | egrep '[0-9]+\.[0-9]+\.[0-9]+' | sort -t- -k3,4 --version-sort -r | sed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e 'uname -r | cut -f1,2 -d"-"' linux-image-3.8.0-34-generic linux-image-3.5.0-44-generic
Removendo essa classificação / sed, recebo
$ dpkg -l linux-{image,headers}-* | awk '/^ii/{print $2}' | egrep '[0-9]+\.[0-9]+\.[0-9]+' | grep -v -e 'uname -r | cut -f1,2 -d"-"' linux-image-3.5.0-44-generic linux-image-3.8.0-34-generic linux-image-extra-3.5.0-44-generic linux-image-extra-3.8.0-34-generic
Assim, seu comando mais complicado perderia dois pacotes em minha máquina, que eu gostaria de remover (agora é possível que esses
linux-image-extra-*
thingys dependam dolinux-image-*
thingys e, portanto, sejam removidos de qualquer maneira, mas podem dói para torná-lo explícito). De qualquer forma, não vejo o ponto de sua classificação; um simplesgrep -v
sem pré-processamento sofisticado deve ser bom, presumivelmente ainda melhor. Eu sou um defensor do princípio KISS. Isso tornará mais fácil para você entender ou depurar mais tarde. Além disso, sem a classificação, é um pouco mais eficiente;) -
Isso é puramente estético, mas você obterá a mesma saída com essa variante ligeiramente mais curta. : -)
$ dpkg -l linux-{image,headers}-* | awk '/^ii/{print $2}' | egrep '[0-9]+\.[0-9]+\.[0-9]+' | grep -v $(uname -r | cut -d- -f-2) linux-image-3.5.0-44-generic linux-image-3.8.0-34-generic linux-image-extra-3.5.0-44-generic linux-image-extra-3.8.0-34-generic
Consequentemente, acabo com o comando mais simples e seguro
$ dpkg -l linux-{image,headers}-* | awk '/^ii/{print $2}' | egrep '[0-9]+\.[0-9]+\.[0-9]+' | grep -v $(uname -r | cut -d- -f-2) | xargs sudo apt-get -y purge
Como você realmente deseja limpar a partição /boot
, uma abordagem completamente diferente seria listar o conteúdo de /boot
, usar dpkg -S
para determinar os pacotes aos quais os arquivos individuais pertencem, filtrar os que são pertencem ao kernel atual e removem os pacotes resultantes. Mas eu gosto mais da sua abordagem, porque ela também encontrará pacotes desatualizados, como linux-headers-*
, que não são instalados em /boot
, mas em /usr/src
.