Debian - install missing man pages?
Solution 1
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.
Solution 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
Related videos on Youtube
Shilon
Updated on September 18, 2022Comments
-
Shilon over 1 year
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:
- getting a list of all installed packages (
dpkg -l | grep ??? | cut ??? | ???
) - 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
- 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 withapt-get install --reinstall
by default.-
derobert almost 11 yearsAnother copy, on the Raspberry Pi site: raspberrypi.stackexchange.com/questions/7918/…
- getting a list of all installed packages (