我运行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)
使用分而治之,我认为这可以通过以下方式获得:
dpkg -l | grep ??? | cut ??? | ???
)remove + install
有点符合要求,但我不认为它与依赖关系很好)sudo apt-get install --reinstall packagename
这是(最简单的)方式吗?
更新
我记得我曾经做过砖块 RaspBMC apt-get upgrade
,所以我想确保在重新安装时不会将软件包升级到较新的版本(apt-get install --reinstall
默认情况下似乎是这种情况。
从@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添加了一个参数。