如何判断哪个命令在我的系统上有最长的手册?

WeS*_*ers 2 scripting man info

有没有一种简单的方法可以找出哪个命令的手册页最长?

jim*_*mij 9

您可以使用简单的命令为您的系统自行计算

$ find /usr/share/man/ -type f -exec ls -S {} + 2>/dev/null | head | while \
  read -r file; do printf "%-40s" "$file"; \
  man "$file" 2>/dev/null | wc -lwm; done | sort -nrk 4
Run Code Online (Sandbox Code Playgroud)

在我的盒子上返回

      (file)                             (lines) (words) (chars)
/usr/share/man/man1/zshall.1.bz2          27017  186394 1688174
/usr/share/man/man1/cmake.1.bz2           22477  106148 1004288
/usr/share/man/man1/cmake-gui.1.bz2       21362  100055  951110
/usr/share/man/man1/perltoc.1.bz2         18179   59783  780134
/usr/share/man/man1/cpack.1.bz2            9694   48264  458528
/usr/share/man/man1/cmakemodules.1.bz2    10637   42022  419127
/usr/share/man/man5/smb.conf.5.bz2         8306   49991  404190
/usr/share/man/man1/perlapi.1.bz2          8548   43873  387237
/usr/share/man/man1/perldiag.1.bz2         5662   37910  276778
/usr/share/man/e                           1518    5919   58630
Run Code Online (Sandbox Code Playgroud)

其中列分别代表行数、单词数和字符数。行(命令)按最后一列排序。

我们可以对信息页面做类似的事情,但我们必须记住它的内容可以跨越许多文件。因此,让我们利用zsh以紧凑形式保持在单行以上的好处:

 $ for inf in ${(u)$(echo /usr/share/info/**/*(.:t:r:r))}; do \
   printf "%-40s" "$inf"; \
   info "$inf" 2>/dev/null | wc -lwm; done | sort -nrk 4
Run Code Online (Sandbox Code Playgroud)

是什么赋予了

   (info title)                          (lines) (words) (chars)
elisp                                     72925  457537 3379403
libc                                      69813  411216 3066817
lispref                                   62753  374938 2806412
emacs                                     47507  322194 2291425
calc                                      33716  244394 1680763
internals                                 32221  219772 1549305
zsh                                       34932  206851 1544909
gsl-ref                                   32493  179954 1518248
gnus                                      31723  180613 1405064
gawk                                      27150  167135 1203395
xemacs                                    25734  170403 1184250
Run Code Online (Sandbox Code Playgroud)

信息页面很大,主要用于与 gnu 相关的内容,这是可以理解的,但我发现有趣的是,例如 zsh 比手册页有更多的行和词,但字符更少。这很有趣,因为乍一看内容是一样的,只是格式有点不同。


zsh 在为循环选择文件时的技巧说明: for inf in ${(u)$(echo /usr/share/info/**/*(.:t:r:r))}; do

目标是从 /usr/share/info 目录和所有子目录创建唯一文件名列表。文件应该从目录名、扩展名和所有数字中删除。上面的代码片段可以重写为${(u)$(echo /usr/share/info/**/*(.)):t:r:r},给出相同的结果,但使用可能更体面的语法,即:

  • **/*: 进入所有子目录并标记那里的所有内容
  • (.): 只选择普通文件
  • :t: 删除路径名组件(像basename)
  • :r: 删除扩展名(最后一个点之后的所有内容,包括点)。它被应用两次以删除不必要的字符串和数字(​​例如.info-6从文件中zsh.info-6.bz2)
  • (u): 只显示唯一的词(在之前的操作之后有很多相同的词 - 同一个 info 命令的不同文件/章节)