如何判斷哪一個指令在我的系統上擁有最長的手冊?

如何判斷哪一個指令在我的系統上擁有最長的手冊?

有沒有簡單的方法可以找出哪個指令有最長的手冊頁?

答案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)。

相關內容