Debian - instala man pages ausentes?

3

Eu corro RaspBMC - uma distro baseada em Raspbian , é um Debian minimalista personalizado para o Raspberry Pi .

Se bem me lembro, o utilitário man NÃO é instalado por padrão com o RaspBMC (embora eu possa estar enganado).

O problema é que os pacotes instalados antes de instalar o utilitário man real não instalam suas páginas man. Isso inclui os pacotes que vêm pré-instalados com o sistema.

Exemplo: eu tentei com o udisks-glue (que vem pré-instalado)

$ man udisks-glue
No manual entry for udisks-glue

Depois de reinstalar o pacote, a página man está lá.

$ apt-get remove udisks-glue
$ apt-get install udisks-glue
$ man udisks-glue
[Man page gets displayed]

A pergunta é: posso de alguma forma instalar todas as páginas de manual ausentes facilmente?

Pelo que vejo, a instalação das páginas man é uma etapa executada para cada comando apt-get install :

Unpacking udisks-glue (from .../udisks-glue_1.3.4-1_armhf.deb) ...
Processing triggers for man-db ...
[...]

Usando o dividir e conquistar, presumo que isso possa ser obtido por:

  1. obtendo uma lista de todos os pacotes instalados ( dpkg -l | grep ??? | cut ??? | ??? )
  2. achando uma maneira de dizer ao apt-get para reinstalar um pacote sem mexer com a configuração (um remove + install se encaixa no projeto, mas eu não acho que ele seja legal com dependências)
    EDIT: isso deve ser feito :
    sudo apt-get install --reinstall packagename
  3. executar 2. sobre cada item em 1.

Este é o caminho (mais simples)?

Atualizar

Eu me lembrei de usar o RaspBMC uma vez fazendo apt-get upgrade , então quero garantir que os pacotes NÃO sejam atualizados para versões mais novas ao reinstalar (o que parece ser o caso com apt-get install --reinstall por padrão.

    
por Cristi Diaconescu 11.06.2013 / 17:34

2 respostas

4

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.

    
por 12.06.2013 / 02:05
2

Parece uma maneira razoavelmente simples de ir. O comando para obter a lista de pacotes e seu status é dpkg --get-selections , então você pode fazer algo assim:

dpkg --get-selections | grep '\<install$' | cut -f1 | xargs apt-get install --reinstall
    
por 11.06.2013 / 18:39

Tags