4

I run RaspBMC - a distro based on Raspbian, that's a custom minimal Debian for the Raspberry Pi.

If I recall correctly, the man utility is NOT installed by default with RaspBMC (although I may be mistaken).

The problem is, packages installed prior to installing the actual man utility do not install their man pages. This includes the packages that come pre-installed with the system.

Example: I tried with udisks-glue (which comes pre-installed)

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

After re-installing that package, the man page is there.

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

The question is: can I somehow install all the missing man pages easily?

From what I can see, installing the man pages is a step that's run for each apt-get install command:

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

Using divide-and-conquer, I assume this could be obtained by:

  1. getting a list of all installed packages ( dpkg -l | grep ??? | cut ??? | ??? )
  2. finding a way to tell apt-get to re-install a package without messing with the config (a remove + install kinda fits the bill, but I don't think it plays nice with dependencies)
    EDIT: this should do it:
    sudo apt-get install --reinstall packagename
  3. run 2. over each item in 1.

Is this the (simplest) way to go?

Update

I remembered I bricked RaspBMC once doing apt-get upgrade, so I want to make sure the packages are NOT upgraded to newer versions when reinstalling (which seems to be the case with apt-get install --reinstall by default.

1

2 Answers 2

5

Starting from @derobert's answer, I worked my way to getting exactly the current version of all packages to reinstall.

Short version:

sudo dpkg -l | grep '^ii ' | sed 's/  */\t/g' |cut -f 2,3 | sed 's/\t/=/' | xargs apt-get install --reinstall -y --ignore-missing

Explained:

The key is actually specifying the required version of each package.

The general command is:

apt-get install --reinstall <package>=<version>

Breaking down the long command line:

$ 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 '

...gets rid of the header lines and a few packages with status 'hold' (marked as hi instead of ii)

$ dpkg -l | grep '^ii ' | sed 's/  */\t/g'

... converts any number of spaces to a single TAB character, preparing the ground for cut.
(Btw: why, oh why, doesn't sed support x+ regex for "character x, one or more times"? It can be emulated with xx* - meaning 'x' once followed by 'x' zero or more times)

The output looks like this:

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.

Next:

$ dpkg -l | grep '^ii ' | sed 's/  */\t/g' | cut -f 2,3 | sed 's/\t/=/'

...gets the name and version of each package (the 2nd and 3rd fields), and replaces the tab that separates them with an '='

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

Finally, pipe each of the above to apt-get as a long list of arguments using xargs.

Notice the parameter --ignore-missing - this command is run as 'best effort' - I don't want the updating to stop because some packages are not available to reinstall (those will stay unmodified)

$ dpkg -l | grep '^ii ' | sed 's/  */\t/g' |cut -f 2,3 | sed 's/\t/=/' | xargs apt-get install --reinstall --ignore-missing

While testing, I also added a --dry-run argument to apt-get.

2

Sounds like a reasonably simple way to go. The command to get the list of packages and their status is dpkg --get-selections, so you could do something like this:

dpkg --get-selections | grep '\<install$' | cut -f1 | xargs apt-get install --reinstall

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .