Ao navegar na Internet por artigos do Ubuntu, deparei-me com este comando:
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
O autor disse que este é um comando de linha única que excluirá todas as versões anteriores do Linux, deixando apenas a atual !
Na verdade, estou procurando por um comando desse tipo, mas não tenho tanta certeza de como isso é seguro. Eu gostaria de saber:
- Se é seguro executar este comando?
- Como esse comando funciona? ou seja, explicação de pequenas partes de um comando tão grande
- Se esse comando servir a algum propósito diferente, qual seria o comando correto para alcançar o que o autor afirma que ele deve fazer?
Fico muito confuso e frustrado quando tento deduzir tudo sozinho. Como isso funciona de comando para que ele contém numerosos /
, |
, \
, *
, e ^
personagens que são difíceis de Google para.
Estou procurando uma tradução e explicação passo a passo para este comando que não consegui encontrar na Internet!
package-management
security
command-line
Bhavesh Diwan
fonte
fonte
apt-get autoremove
não sugere remoções de kernels antigos para mim. Se eu não excluí-los, eles simplesmente se acumularão até que meu/boot
espaço acabe e as atualizações falhem. Você tem uma referência sobre isso que deve fazer isso?s/^[^ ]* [^ ]* \([^ ]*\).*/\1/
não simplesmentes/^[^ ]* \([^ ]*\).*/\1/
. O script não é muito robusto ou elegante. Por exemplo, por que verificar o kernel atual antes de extrair o nome do pacote da saída? Como alternativa,sudo apt-get autoremove --purge
elimina a maioria dos kernels antigos em uma versão mais recente do Ubuntu, como o Xubuntu 15.10.Respostas:
Eu diria: não use no formulário atual
Faz alterações sem perguntar. A
apt-get -y purge
peça permite que o one-liner comece a executar os pacotes de limpeza, sem a sua confirmação. Se houver algum erro no script, você poderá ser ferrado .Nenhuma fonte, nenhum autor fornecido. A fonte disso faz a diferença aqui. Caso venha de um pacote de sistema completamente testado, podemos rastrear os testes que estão sendo feitos nele. De uma fonte aleatória, não podemos confiar nela.
dpkg -l
corre bem semsudo
. Não vejo por que o autor original achou que isso era necessário.Use o senso comum
Remova as partes prejudiciais e deixe de fora qualquer coisa que corra como raiz.
Por exemplo, reduza para isso:
que apenas produz coisas e roda com permissões de usuário regulares . Depois de concordar com a remoção desses kernels, você pode se anexar
| xargs sudo apt-get purge
. É sem a-y
opção, intencionalmente, portanto, você será solicitado a confirmar as alterações a serem feitas no seu sistema.Explicação
dpkg -l
Mostra a lista de todos os pacotes. Nesse caso, ele listará apenas os pacotes que começam comlinux-
o nome.|
(um canal) canaliza a saída do comando à esquerda (chamamos issostdout
) à entrada do comando à direita (chamamos issostdin
).sed
é uma ferramenta para manipular strings usando expressões regulares . Nesse caso, ele manipula a saída do comando à esquerda do pipe e filtra os pacotes instalados (dependendo doii
que é fornecido pordpkg
). Ele está sendo aninhado neste caso. Seria muito difícil explicar todo o usosed
aqui, pois seu uso é muito complicado com as complexas expressões regulares. (\(.*\)-\([^0-9]\+\)"
é um exemplo de expressão regular.\1
é a referência de substituição para fazer uma espécie de pesquisa e substituição universal (referenciando o primeiro 'hit' com1
). A própria expressão regular não pode causar nenhum mal. No entanto, se eles manipularem a entrada de maneira errada, poderão remover os pacotes errados ou até mesmo fazer a injeção do shell. Nesse caso, parece uma maneira de encontrar o nome do pacote do kernel com base na versão fornecida poruname -r
.uname -r
gera a versão atual do kernel em execução.xargs
anexa as linhas da entrada esquerda do canal como argumentos ao comando. Nesse caso, as versões do kernel em cada linha são convertidas em uma lista separada por espaço horizontal e anexadas aosudo apt-get
comando.sudo apt-get -y purge [packagename]
limpa (remove tudo) dos pacotes fornecidos (como argumentos).Alternativas
Provavelmente já são feitas algumas perguntas sobre isso. Relevantes que encontrei até agora:
A partir desta resposta , o seguinte comando parece fazer o mesmo de uma maneira muito mais segura e comum:
fonte
\1
é o controle de substituição para fazer uma espécie de pesquisa e substituição universal. Para remover qualquer pacote, eu me expressei claramente na minha resposta (sendo minha opinião): use o bom senso. Não deixe que um script faça alterações no seu sistema automaticamente. Verifique o que faria. Sempre.Você pediu uma explicação passo a passo, então aqui vai:
Lista pacotes iniciados com
linux-
no nome do pacotee canalize a lista
sed
que usará uma expressão regular muito complicada para editar a lista
que canalizará a nova lista
xargs
, que a enviará como argumento paraque eliminará esses pacotes sem lhe dar a chance de mudar de idéia.
Ou talvez seja mais preciso dizer que enviará essa lista para o comando de limpeza e deixará assim. Se alguma coisa é eliminada - e importante - exatamente o que é eliminado depende da saída dos comandos anteriores.
É seguro? Nesse caso, tudo depende de quão bem o autor da postagem em que você a encontrou entende expressões regulares e
sed
sintaxe. E há livros inteiros sobre esses dois tópicos.fonte
Comecei dissecando os comandos, lendo a
man
página de cada um.dpkg -l
: list pacakges, portanto, listariadpkg -l linux-*
todos os pacotes iniciados comlinux-
(geralmente kernels).sed
: A saída dedpkg -l linux-*
é canalizadased
com várias expressões regulares quesed
decodificam.uname -r
uname
imprime informações do sistemaO
-r
identificador imprime especificamente as versões do kernel:A saída de
uname -r
é então canalizada parased
com mais expressões regulares, cuja saída é passada paraxargs
Portanto,
xargs
converte ased
saída em nomes de pacotes e os passa para ossudo apt-get purge -y
quais responde automaticamente 'yes' a todos os prompts:No geral, parece que este comando fará o que você deseja, embora tenha certeza de que teríamos que traduzir
sed
as expressões regulares do tradutor .Eu apenas corri:
Aqui está uma captura de tela:
Todas as versões antigas do kernel iirc.
fonte