システム上でどのコマンドのマニュアルが最も長いかを知るにはどうすればよいですか?

システム上でどのコマンドのマニュアルが最も長いかを知るにはどうすればよいですか?

どのコマンドのマニュアルページが最も長いかを調べる簡単な方法はありますか?

答え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上記の 1 行をコンパクトな形式で維持するために、 の利点を活用しましょう。

 $ 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 では行数と単語数は多いのに、man ページよりも文字数が少ないのは興味深いと思います。一見すると内容は同じで、フォーマットが少し異なるだけなので興味深いです。


ループのファイルを選択する際の 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: 拡張子を削除します(最後のドット以降のすべて、ドットを含む)。不要な文字列と数字も削除するには、2回適用します(例:.info-6ファイルからzsh.info-6.bz2
  • (u): 一意の単語のみを表示します (以前の操作の後、同じ info コマンドに対して同じ単語が多数存在します - 異なるファイル/章)

答え2

/usr/share/man/manXマニュアル ページは、セクションX( で説明)に保存されますman man。マニュアル ページは gzip 形式で圧縮されているため、圧縮ファイルが大きいほどマニュアル ページも大きくなると想定します。

/usr/share/man/man1コマンドを使用して (セクション 1: 実行可能プログラムまたはシェル コマンド) をチェックインするとgzip -l *.gz | sort -n -k2、次のようになります (これはおそらくディストリビューションごとに異なりますが、これは多数のパッケージを含む Arch Linux システム上で実行されました)。最初の列は圧縮ファイルのサイズで、2 番目の列は圧縮されていないファイルのサイズです。

         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、ファイル末尾の行数を で確認し:f、次の結果を得ました。

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

答え4

@jimmij の例は興味深いですが、1 つのサブディレクトリからのみ結果を返すため、正しくありません。そのスクリプトを実行すると (私の 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)。

関連情報