我跑树莓BMC- 一个基于的发行版树莓派,这是一个定制的最小 Debian树莓派。
如果我没记错的话,man
默认情况下,该实用程序并未随 RaspBMC 安装(尽管我可能是错误的)。
问题是,在安装实际man
实用程序之前安装的软件包不会安装其手册页。这包括系统预安装的软件包。
示例:我尝试使用 udisks-glue (已预装)
$ man udisks-glue
No manual entry for udisks-glue
重新安装该软件包后,手册页就出现了。
$ apt-get remove udisks-glue
$ apt-get install udisks-glue
$ man udisks-glue
[Man page gets displayed]
问题是:我可以以某种方式安装全部很容易丢失手册页吗?
据我所知,安装手册页是为每个apt-get install
命令运行的一个步骤:
Unpacking udisks-glue (from .../udisks-glue_1.3.4-1_armhf.deb) ...
Processing triggers for man-db ...
[...]
使用分治法,我认为这可以通过以下方式获得:
- 获取所有已安装软件包的列表 (
dpkg -l | grep ??? | cut ??? | ???
) - 找到一种方法告诉 apt-get 重新安装软件包而不弄乱配置(有点
remove + install
符合要求,但我认为它与依赖项配合得不好)
编辑:这应该可以做到:
sudo apt-get install --reinstall packagename
- 对 1 中的每个项目运行 2.
这是(最简单的)方法吗?
更新
我记得我曾经做过一次,所以我想确保重新安装时软件包不会升级到较新的版本(默认情况apt-get upgrade
下似乎是这样。apt-get install --reinstall
答案1
从 @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
解释:
关键实际上是指定每个包所需的版本。
一般命令是:
apt-get install --reinstall <package>=<version>
分解长命令行:
$ 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 '
...摆脱标题行和一些状态为“ hold
”的包(标记为hi
而不是ii
)
$ dpkg -l | grep '^ii ' | sed 's/ */\t/g'
...将任意数量的空格转换为单个制表符,为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.
下一个:
$ dpkg -l | grep '^ii ' | sed 's/ */\t/g' | cut -f 2,3 | sed 's/\t/=/'
...得到名字和版本每个包的(第二个和第三个字段),并用“=”替换分隔它们的制表符
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
最后,使用 . 将上述每个内容作为一长串参数通过管道传递给 apt-get 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
在测试时,我还--dry-run
为 apt-get 添加了一个参数。
答案2
听起来是一个相当简单的方法。获取包列表及其状态的命令是dpkg --get-selections
,因此您可以执行以下操作:
dpkg --get-selections | grep '\<install$' | cut -f1 | xargs apt-get install --reinstall