Como posso saber qual comando possui o manual mais longo do meu sistema?

2

Existe uma maneira fácil de descobrir qual comando possui as páginas de manual mais longas?

    
por WeSenseASoulInSearchOfAnswers 09.10.2014 / 00:41

4 respostas

9

Você pode calcular você mesmo 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. Linhas (comandos) são classificadas pela última coluna.

Podemos fazer coisas semelhantes para páginas de informações, mas temos que ter em mente que o conteúdo pode abranger muitos arquivos. Assim, vamos usar os benefícios de zsh para manter acima do one-liner de forma compacta:

 $ 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 dá

   (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, o zsh tenha mais linhas e palavras, mas menos caracteres do que nas man pages. É interessante porque, à primeira vista, o conteúdo é o mesmo, apenas a formatação é um pouco diferente.

Explicação dos truques 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 no diretório / usr / share / info e em todos os subdiretórios. Os arquivos devem ser retirados de dirname, extenstions e todos os números. O snippet 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:

  • **/* : descida em todos os subdiretórios e marcar tudo lá
  • (.) : selecione apenas arquivos simples
  • :t : remova componentes do nome do caminho (funciona como basename )
  • :r : remove a extensão (tudo depois do último ponto, incluindo o ponto). Ele é aplicado duas vezes para remover também a sequência e o número desnecessários (por exemplo, .info-6 do arquivo zsh.info-6.bz2 )
  • (u) : mostra apenas palavras únicas (após as operações anteriores, existem muitas as mesmas palavras - diferentes arquivos / capítulos para o mesmo comando info)
por 09.10.2014 / 01:00
3

As páginas do manual são armazenadas em /usr/share/man/manX , em que X é 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: Executable programs ou shell commands) com o comando gzip -l *.gz | sort -n -k2 , eu entendi (o que provavelmente varia de distro a distro, isso foi em um sistema Arch Linux com um monte de pacotes) em que a primeira coluna é o tamanho do arquivo compactado 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
    
por 09.10.2014 / 01:00
2

Uma alternativa aos métodos fornecidos por @Renan e @jimmij rende wireshark-filter do 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 maiores entradas com man e verifiquei o número de linhas no final do arquivo com :f e criei:

wireshark-filter = 245016 lines
gcc              =   8341 lines
perlfunc         =   5132 lines
    
por 09.10.2014 / 01:17
0

O exemplo de @jimmij é interessante, mas incorreto porque retorna resultados de apenas um subdiretório. Rodando esse script (no meu Debian 7), eu entendi:

/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 que fornece

/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

Por que vale a pena, existem 10326 arquivos em /usr/share/man nessa máquina (ymmv).

    
por 04.12.2016 / 18:37