
どのコマンドのマニュアルページが最も長いかを調べる簡単な方法はありますか?
答え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)。