Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

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.

share|improve this question
    
Another copy, on the Raspberry Pi site: raspberrypi.stackexchange.com/questions/7918/… –  derobert Jun 11 '13 at 16:41

2 Answers 2

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.

share|improve this answer

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
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.