Existe uma maneira fácil de descobrir qual comando possui as páginas de manual mais longas?
Responder1
Você mesmo pode calculá-lo para o seu sistema com um comando simples
$ 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
que retorna na minha caixa
(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
onde as colunas representam o número de linhas, palavras e caracteres, respectivamente. As linhas (comandos) são classificadas pela última coluna.
Podemos fazer algo semelhante para páginas de informações, mas devemos ter em mente que seu conteúdo pode abranger muitos arquivos. Portanto, vamos usar os benefícios de zsh
manter a linha acima em formato compacto:
$ 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
o que da
(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
As páginas de informações são enormes principalmente para coisas relacionadas ao GNU, o que é compreensível, mas acho interessante que, por exemplo, zsh tenha mais linhas e palavras, mas menos caracteres do que nas páginas de manual. É interessante porque à primeira vista o conteúdo é o mesmo, só que a formatação é um pouco diferente.
Explicação dos truques do zsh na seleção dos arquivos para o loop:for inf in ${(u)$(echo /usr/share/info/**/*(.:t:r:r))}; do
O objetivo é criar a lista de nomes de arquivos exclusivos do diretório /usr/share/info e de todos os subdiretórios. Os arquivos devem ser removidos do nome do diretório, extensões e todos os números. O trecho acima pode ser reescrito como ${(u)$(echo /usr/share/info/**/*(.)):t:r:r}
, o que dá o mesmo resultado, mas usa uma sintaxe provavelmente mais decente, a saber:
**/*
: desça em todos os subdiretórios e marque tudo lá(.)
: selecione apenas arquivos simples:t
: remova os componentes do nome do caminho (funciona comobasename
):r
: remova a extensão (tudo após o último ponto, incluindo o ponto). É aplicado duas vezes para remover também strings e números desnecessários (por exemplo,.info-6
do arquivozsh.info-6.bz2
)(u)
: mostra apenas palavras únicas (após operações anteriores, há muitas palavras iguais - arquivos/capítulos diferentes para o mesmo comando info)
Responder2
As páginas de manual são armazenadas /usr/share/man/manX
onde X
está a seção (descrita em man man
). Eles são compactados no formato gzip, então vamos supor que um arquivo compactado maior signifique uma página de manual maior.
Ao fazer check-in /usr/share/man/man1
(seção 1: Programas executáveis ou comandos shell) com o comando gzip -l *.gz | sort -n -k2
, recebo isto (que provavelmente variará de distro para distro, isso foi em um sistema Arch Linux com vários pacotes) onde a primeira coluna é o arquivo compactado tamanho do arquivo e a segunda coluna é o tamanho do arquivo descompactado:
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
Responder3
Uma alternativa aos métodos fornecidos por @Renan e @jimmij produz wireshark-filter
o grande vencedor no meu sistema.
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
Com base nisso, abri cada uma das entradas maiores man
e verifiquei o número de linhas no final do arquivo com a :f
e descobri:
wireshark-filter = 245016 lines
gcc = 8341 lines
perlfunc = 5132 lines
Responder4
O exemplo de @jimmij é interessante, mas incorreto porque retorna resultados de apenas um subdiretório. Executando esse script (no meu Debian 7), recebo o seguinte:
/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
Aqui está uma revisão rápida que corrige esse problema:
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
No meu sistema Debian 7 isso dá
/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
Pelo que vale, existem 10.326 arquivos /usr/share/man
nessa máquina (ymmv).