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 maneira de pensar sobre esse problema é dividir isso em três partes:
- Como obtenho uma lista de pacotes não instalados como dependências?
- Como obtenho 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
Abordagens semelhantes podem ser encontradas nos links que Gilles postou como um comentário para a pergunta. Algumas fontes afirmam que isso só funcionará se você tiver usado o aptitude para instalar os pacotes; no entanto, quase nunca uso o aptitude para instalar pacotes e descobri que isso ainda funcionava. Os --disable-columns
impede aptitude de preenchimento linhas de nomes de pacotes com espaços em branco, que impeçam a comparação abaixo. Classifica | sort -u
o arquivo e remove duplicatas. Isso facilita muito a etapa final.
Como obtenho uma lista dos pacotes instalados por padrão?
Nota: Esta seção começa com um 'caminho errado' que eu acho ilustrativo. O segundo pedaço de código é aquele que funciona.
Isso é um pouco mais complicado. Inicialmente, pensei que uma boa aproximação seria todos os pacotes dependentes dos meta-pacotes ubuntu-minimal, ubuntu-standard, ubuntu-desktop e 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, 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 tinham que vir por padrão. Ainda acredito que esse método funcione se alguém construir a lista correta de metapacotes.
No entanto, parece que os espelhos do Ubuntu contêm um arquivo "manifesto" que contém todos os pacotes na instalação padrão. O manifesto do Ubuntu 12.04.3 está aqui:
http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest
Se você pesquisar nesta página (ou na página de um espelho mais próxima de você):
http://mirror.pnl.gov/releases/precise/
Você deve conseguir 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 única, mas eu queria ter certeza de que estava corretamente classificada para facilitar o próximo passo. Eu então coloco a saída defaultinstalled.txt
.
Como posso obter a diferença entre essas duas listas?
Esta é a parte mais fácil, já que a maioria dos sistemas tipo Unix tem muitas ferramentas para fazer isso. A comm
ferramenta é uma das muitas maneiras de fazer isso:
comm -23 currentlyinstalled.txt defaultinstalled.txt
Isso deve imprimir a lista de linhas exclusivas do primeiro arquivo. Portanto, ele deve imprimir uma lista de pacotes instalados que não estão na instalação padrão.
aptitude search '~i!~M' -F %p
não?