A partir da resposta de @ derobert, eu trabalhei meu caminho para obter exatamente a versão atual de todos os pacotes para reinstalar.
Versão resumida:
sudo dpkg -l | grep '^ii ' | sed 's/ */\t/g' |cut -f 2,3 | sed 's/\t/=/' | xargs apt-get install --reinstall -y --ignore-missing
Explicado:
A chave está, na verdade, especificando a versão necessária de cada pacote.
O comando geral é:
apt-get install --reinstall <package>=<version>
Quebrando a longa linha de comando:
$ dpkg -l
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-===========================================================-==================================-============-========================================================================
ii adduser 3.113+nmu3 all add and remove users and groups
ii apt 0.9.7.8+rpi1 armhf commandline package manager
ii apt-utils 0.9.7.8+rpi1 armhf package managment related utility programs
ii aptitude-common 0.6.8.2-1 all architecture indepedent files for the aptitude package manager
ii atmel-firmware 1.3-4 all Firmware for Atmel at76c50x wireless networking chips.
$ dpkg -l | grep '^ii '
... livra-se das linhas de cabeçalho e alguns pacotes com o status ' hold
' (marcado como hi
em vez de ii
)
$ dpkg -l | grep '^ii ' | sed 's/ */\t/g'
... converte qualquer número de espaços em um único caractere TAB, preparando o terreno para cut
.
(Btw: por que, por que, não sed
support x+
regex para "caractere x, uma ou mais vezes"? Ele pode ser emulado com xx*
- significando 'x' uma vez seguido por 'x' zero ou mais vezes)
A saída é assim:
ii adduser 3.113+nmu3 all add and remove users and groups
ii apt 0.9.7.8+rpi1 armhf commandline package manager
ii apt-utils 0.9.7.8+rpi1 armhf package managment related utility programs
ii aptitude-common 0.6.8.2-1 all architecture indepedent files for the aptitude package manager
ii atmel-firmware 1.3-4 all Firmware for Atmel at76c50x wireless networking chips.
Próximo:
$ dpkg -l | grep '^ii ' | sed 's/ */\t/g' | cut -f 2,3 | sed 's/\t/=/'
... obtém o nome e a versão de cada pacote (os 2º e 3º campos) e substitui a guia que os separa por um '='
adduser=3.113+nmu3
apt=0.9.7.8+rpi1
apt-utils=0.9.7.8+rpi1
aptitude-common=0.6.8.2-1
atmel-firmware=1.3-4
Finalmente, canalize cada uma das opções acima para o apt-get como uma longa lista de argumentos usando xargs
.
Observe que o parâmetro --ignore-missing
- este comando é executado como "melhor esforço" - não quero que a atualização pare porque alguns pacotes não estão disponíveis para reinstalação (eles não serão modificados)
$ dpkg -l | grep '^ii ' | sed 's/ */\t/g' |cut -f 2,3 | sed 's/\t/=/' | xargs apt-get install --reinstall --ignore-missing
Durante o teste, também adicionei um argumento --dry-run
ao apt-get.