jozz (11-10-2013, 17:13) escreveu:Olá caro amigo Claudio. Interessante este comando para deletar Kernel antigo do Ubuntu. Dentro da filosofia Linux e, sem querer questionar demais- gostaria de saber o que o comando faz, o significado dele. Não me agrada fazer algo que não entendo bem, confiar apenas... Poderia sugerir de que modo poderei vir a entender plenamente este comando? Obrigado. Jozz (novo no linux).
Este comando não só é dotado de coisas simples como de coisas complicadas, pelo menos para quem não é programador, mas vou tentar explicar!
Para começar, no terminal você pode encadear comandos, onde o output de um comando entra como input de outro comando. Para isso utiliza-se o caracter pipe, que basicamente é este |
Assim, analisando o comando referido
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
nós podemos desmontá-lo, então, nos vários comandos listados a seguir:
- 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
Portanto cada comando vai mandar um certo output em que o comando seguinte vai apanhar esse resultado e trabalhá-lo. No caso do comando 1, este lista todos os pacotes que começam por "linux-". O objetivo deste comando, que utiliza o programa dpkg, é listar os pacotes referentes ao kernel, que geralmente começam com o nome "linux-", por exemplo "linux-headers-3.10.10-031010-generic".
Os comandos de 2 utilizam o programa sed que basicamente é um programa de substituição, que geralmente utiliza expressões regulares. E é neste aspeto que eu falei que é mais complexo, mais virado para os programadores. Neste caso o comando 2 tem também pipes, mas dentro de uma variável através do $, em que tudo o que está dentro dos parenteses vai dar um outro ouput que será integrado nos argumentos do comando 2. Dentro desses parenteses temos então
uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/"
que dividindo dá então:
- uname -r
- sed "s/\(.*\)-\([^0-9]\+\)/\1/"
Em a) obtem-se informação do Kernel a ser utilizado atualmente e em b) é feita a filtragem para se ficar apenas com o "número" da versão do Kernel que será então utilizada como "bloqueador" para não remover este kernel no comando 2.
Posto isto, o comando 2 vai então pegar na lista obtida pelo comando 1 e vai filtrar aceitando apenas as linhas começando por "ii" (que significam pacotes que deviam estar instalados e foram efetivamente instalados), pondo essas linhas apenas com o nome do pacote e aceitando apenas as linhas que não sejam do kernel atual mas que efetivamente identifiquem kernels (que têm de ter necessariamente números).
O resultado do comando 2 dá então um conjunto de linhas em que cada linha é um nome de um pacote. o comando 3, utiliza o programa xargs que basicamente executa o comando que vem por argumento o número de vezes quantas as linhas existentes. E para cada uma das execuções põe nesse comando o conteúdo da linha como argumento.
Bom, penso que consegui explicar tudo, no entanto não revi o que escrevi, por isso se você tiver alguma pergunta, não hesite em questionar!