Apenas o código
aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currentlyinstalled.txt
wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest \
| cut -f1 | sort -u > defaultinstalled.txt
comm -23 currentlyinstalled.txt defaultinstalled.txt
Explicação
Uma forma de pensar sobre esse problema é dividir isso em três partes:
- Como obtenho uma lista de pacotes não instalados como dependências?
- Como faço para obter uma lista dos pacotes instalados por padrão?
- Como posso obter a diferença entre essas duas listas?
Como obtenho uma lista de pacotes não instalados como dependências?
O seguinte comando parece funcionar no meu sistema:
$ aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currentlyinstalled.txt
Enfoques semelhantes podem ser encontrados nos links que Gilles postou como um comentário para a questão. Algumas fontes afirmam que isso só funcionará se você usou o aptitude para instalar os pacotes; No entanto, quase nunca uso o aptitude para instalar pacotes e descobri que isso ainda funcionava. O --disable-columns
impede o aptitude de preencher linhas de nomes de pacotes com espaços em branco que impediriam a comparação abaixo. O | sort -u
classifica o arquivo e remove as duplicatas. Isso torna a etapa final muito mais fácil.
Como faço para obter uma lista dos pacotes instalados por padrão?
Note: This section starts out with a 'wrong path' that I think is illustrative. The second piece of code is the one that works.
Isso é um pouco mais complicado. Inicialmente pensei que uma boa aproximação seria todos os pacotes que são dependências dos meta-pacotes ubuntu-minimal, ubuntu-standard, ubuntu-desktop e os vários pacotes relacionados ao kernel do Linux. Alguns resultados nas pesquisas do Google pareciam usar essa abordagem. Para obter uma lista dessas dependências, primeiro tentei o seguinte (que não funcionou):
$ apt-cache depends ubuntu-desktop ubuntu-minimal ubuntu-standard linux-* | awk '/Depends:/ {print $2}' | sort -u
Isso parece deixar de fora alguns pacotes que eu sei que vieram por padrão. Eu ainda acredito que este método funcione se construirmos a lista correta de meta-pacotes.
No entanto, parece que os espelhos do Ubuntu contêm um arquivo "manifest" que contém todos os pacotes na instalação padrão. O manifesto para o Ubuntu 12.04.3 está aqui:
Se você pesquisar por essa página (ou a página de um espelho mais perto de você):
Você deve ser capaz de encontrar o arquivo ". manifest" que corresponde à versão e arquitetura que você está usando. Para extrair apenas os nomes dos pacotes, fiz isso:
wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest | cut -f1 | sort -u > defaultinstalled.txt
A lista provavelmente já estava classificada e era única, mas eu queria ter certeza de que estava classificada corretamente para facilitar o próximo passo. Em seguida, coloco a saída em defaultinstalled.txt
.
Como posso obter a diferença entre essas duas listas?
Esta é a parte mais fácil, já que a maioria dos sistemas Unix-like tem muitas ferramentas para fazer isso. A ferramenta comm
é uma das muitas maneiras de fazer isso:
comm -23 currentlyinstalled.txt defaultinstalled.txt
Isso deve imprimir a lista de linhas exclusivas do primeiro arquivo. Assim, deve imprimir uma lista de pacotes instalados que não estão na instalação padrão.