Debian - 安装缺少的手册页?

Cri*_*scu 4 man debian apt

我运行RaspBMC - 基于Raspbian的发行版,这是Raspberry Pi的自定义最小 Debian 。

如果我man没记错的话,该实用程序默认没有安装在 RaspBMC 中(尽管我可能会误会)。

问题是,在安装实际man实用程序之前安装的软件包不会安装其手册页。这包括系统预装的软件包。

示例:我尝试使用 udisks-glue(预装)

$ man udisks-glue
No manual entry for udisks-glue
Run Code Online (Sandbox Code Playgroud)

重新安装该软件包后,手册页就在那里。

$ apt-get remove udisks-glue
$ apt-get install udisks-glue
$ man udisks-glue
[Man page gets displayed]
Run Code Online (Sandbox Code Playgroud)

问题是:我能以某种方式轻松安装所有丢失的手册页吗?

据我所知,安装手册页是为每个apt-get install命令运行的一个步骤:

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

使用分而治之,我认为这可以通过以下方式获得:

  1. 获取所有已安装软件包的列表 ( dpkg -l | grep ??? | cut ??? | ???)
  2. 找到一种方法来告诉 apt-get 重新安装一个包而不会弄乱配置(remove + install有点符合要求,但我不认为它与依赖关系很好)
    编辑:这应该这样做
    sudo apt-get install --reinstall packagename
  3. 运行 2. 1 中的每个项目。

这是(最简单的)方式吗?

更新

我记得我曾经做过砖块 RaspBMC apt-get upgrade,所以我想确保在重新安装时不会将软件包升级到较新的版本(apt-get install --reinstall默认情况下似乎是这种情况。

Cri*_*scu 5

从@derobert 的回答开始,我按照自己的方式获取要重新安装的所有软件包的当前版本。

精简版:

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

解释:

关键实际上是指定每个包所需的版本。

一般命令是:

apt-get install --reinstall <package>=<version>
Run Code Online (Sandbox Code Playgroud)

分解长命令行:

$ 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 '
Run Code Online (Sandbox Code Playgroud)

...摆脱标题行和一些状态为“ hold”的包(标记为hi而不是ii

$ dpkg -l | grep '^ii ' | sed 's/  */\t/g'
Run Code Online (Sandbox Code Playgroud)

... 将任意数量的空格转换为单个 TAB 字符,为cut.
(顺便说一句:为什么,哦,为什么,不sed支持x+“字符 x,一次或多次”的正则表达式?可以模拟xx*- 意思是“x”一次后跟“x”零次或多次)

输出如下所示:

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.
Run Code Online (Sandbox Code Playgroud)

下一个:

$ dpkg -l | grep '^ii ' | sed 's/  */\t/g' | cut -f 2,3 | sed 's/\t/=/'
Run Code Online (Sandbox Code Playgroud)

...获取每个包的名称和版本(第二个和第三个字段),并用“=”替换分隔它们的制表符

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
Run Code Online (Sandbox Code Playgroud)

最后,使用xargs.

请注意参数--ignore-missing- 此命令以“尽力而为”的方式运行 - 我不希望更新停止,因为某些软件包无法重新安装(这些软件包将保持不变)

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

在测试时,我还--dry-run向 apt-get添加了一个参数。