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

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

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

答案1

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

$ 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

返回到我的盒子上

      (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

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

我们可以对信息页面做类似的事情,但我们必须记住它的内容可以跨越许多文件。因此,让我们利用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

是什么赋予了

   (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

信息页面很大,主要是与 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):仅显示唯一的单词(在之前的操作之后有许多相同的单词 - 相同信息命令的不同文件/章节)

答案2

手册页存储在该部分的/usr/share/man/manX位置(在 参考资料中描述)。它们以 gzip 格式压缩,因此我们假设较大的压缩文件意味着较大的联机帮助页。Xman man

/usr/share/man/man1通过使用命令签入(第 1 节:可执行程序或 shell 命令) gzip -l *.gz | sort -n -k2,我得到了这个(这可能会因发行版而异,这是在带有一堆软件包的 Arch Linux 系统上),其中第一列是压缩的文件大小,第二列是未压缩的文件大小:

         161077              607106  73.5% ffprobe-all.1
         198943              757155  73.7% ffserver-all.1
         217339              792577  72.6% msp430-g++.1
         217339              792577  72.6% msp430-gcc.1
         209129              794118  73.7% ffmpeg-all.1
         261778              972719  73.1% avr-g++.1
         261778              972719  73.1% avr-gcc.1
         262154              975423  73.1% g++.1
         262154              975423  73.1% gcc.1
         227830             1123043  79.7% perltoc.1perl

答案3

@Renan 和 @jimmij 提供的方法的替代方案wireshark-filter在我的系统上产生了大赢家。

for i in {1..9}; do du -sh man"$i"/*.gz | grep -v "^..0K" | grep -v "^0\|^12K\|^16K\|^[0-9][0-9]K" ; done

基于此,我打开了每个最大的条目,man并用 a 检查了文件末尾的行数:f,并得出:

wireshark-filter = 245016 lines
gcc              =   8341 lines
perlfunc         =   5132 lines

答案4

@jimmij 的示例很有趣,但不正确,因为它仅从一个子目录返回结果。运行该脚本(在我的 Debian 7 上),我得到:

/usr/share/man/man3/DBI.3pm.gz             6182   35812  271206
/usr/share/man/man8/openvpn.8.gz           4021   24702  202032
/usr/share/man/pt/man1/nmap.1.gz           2563   21214  159284
/usr/share/man/man8/lsof.8.gz              2714   18670  142698
/usr/share/man/man3/pcrepattern.3.gz       2579   18631  131204
/usr/share/man/man3/pcreapi.3.gz           2382   16966  123349
/usr/share/man/man8/iptables.8.gz          2631   14844  114354
/usr/share/man/man8/ip6tables.8.gz         2465   13619  105283
/usr/share/man/man3/CPAN.3perl.gz          2142   12346   98823
/usr/share/man/man8/mount.8.gz             2136   12059   97407

这是解决该问题的快速修订:

find /usr/share/man/ -type f -ls | \
        awk '{ printf "%s %s\n", $7, $11; }' | \
        sort -r -n 2>/dev/null | \
        awk '{ printf "%s\n", $2; }' 2>/dev/null | head -n 20 |
while \
        read -r file; do printf "%-40s" "$file"; \
        man "$file" 2>/dev/null | wc -lwm; done | sort -nrk 4

在我的 Debian 7 系统上

/usr/share/man/man1/cmake.1.gz            19264   86499  803021
/usr/share/man/man1/perltoc.1.gz          18755   62738  657990
/usr/share/man/man1/fvwm2.1.gz             8942   57060  462861
/usr/share/man/man1/cmakemodules.1.gz      9843   37965  376314
/usr/share/man/man1/perlfunc.1.gz          7535   47684  370246
/usr/share/man/man5/smb.conf.5.gz          8303   49962  359329
/usr/share/man/man1/cpack.1.gz             8037   38214  342264
/usr/share/man/man1/bash.1.gz              5465   42031  320015
/usr/share/man/man1/perlapi.1.gz           7074   36791  309196
/usr/share/man/man1/xterm-dev.1.gz         6242   34747  297639
/usr/share/man/man3/DBI.3pm.gz             6182   35812  271206
/usr/share/man/man1/xterm.1.gz             5238   29434  253526
/usr/share/man/man1/zshcompsys.1.gz        4502   31336  244115
/usr/share/man/man1/perldiag.1.gz          4939   33200  237882
/usr/share/man/man1/tcsh.1.gz              4355   29640  226498
/usr/share/man/ru/man1/nmap.1.gz           3048   21396  187181
/usr/share/man/hu/man1/nmap.1.gz           3020   21519  186431
/usr/share/man/de/man1/nmap.1.gz           2965   21384  182926
/usr/share/man/man1/nmap.1.gz              3005   24785  179485
/usr/share/man/ru/man1/mc.1.gz             3571   19200  173292

无论如何,/usr/share/man该机器上有 10326 个文件 (ymmv)。

相关内容