¿Cómo puedo saber qué comando tiene el manual más largo en mi sistema?

¿Cómo puedo saber qué comando tiene el manual más largo en mi sistema?

¿Existe una manera fácil de saber qué comando tiene las páginas de manual más largas?

Respuesta1

Puedes calcularlo tú mismo para tu sistema con un simple comando.

$ 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 regresa a mi caja

      (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

donde las columnas representan el número de líneas, palabras y caracteres respectivamente. Las filas (comandos) se ordenan por la última columna.

Podemos hacer algo similar con las páginas de información, pero debemos tener en cuenta que su contenido puede abarcar muchos archivos. Por lo tanto, usemos los beneficios de zshmantener la línea anterior en 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

lo 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

Las páginas de información son enormes, principalmente para cosas relacionadas con gnu, lo que es comprensible, pero me parece interesante que, por ejemplo, zsh tenga más líneas y palabras pero menos caracteres que en las páginas de manual. Es interesante porque a primera vista el contenido es el mismo, sólo que el formato es un poco diferente.


Explicación de trucos de zsh en la selección de los archivos para el bucle:for inf in ${(u)$(echo /usr/share/info/**/*(.:t:r:r))}; do

El objetivo es crear una lista de nombres de archivos únicos desde el directorio /usr/share/info y todos los subdirectorios. Los archivos deben eliminarse del nombre de directorio, las extensiones y todos los números. El fragmento anterior se puede reescribir como ${(u)$(echo /usr/share/info/**/*(.)):t:r:r}, lo que da el mismo resultado pero usa probablemente una sintaxis más decente, a saber:

  • **/*: descender a todos los subdirectorios y marcar todo allí
  • (.): seleccione solo archivos sin formato
  • :t: elimina los componentes del nombre de ruta (funciona como basename)
  • :r: eliminar extensión (todo lo que está después del último punto, incluido el punto). Se aplica dos veces para eliminar también cadenas y números innecesarios (por ejemplo, .info-6del archivo zsh.info-6.bz2).
  • (u): muestra solo palabras únicas (después de operaciones anteriores, hay muchas palabras iguales: diferentes archivos/capítulos para el mismo comando de información)

Respuesta2

Las páginas de manual se almacenan en /usr/share/man/manXdonde Xestá la sección (descrita en man man). Están comprimidos en formato gzip, así que supongamos que un archivo comprimido más grande significa una página de manual más grande.

Al registrar /usr/share/man/man1(sección 1: Programas ejecutables o comandos de shell) con el comando gzip -l *.gz | sort -n -k2, obtengo esto (que probablemente variará de una distribución a otra, esto fue en un sistema Arch Linux con un montón de paquetes) donde la primera columna está comprimida tamaño del archivo y la segunda columna es el tamaño del archivo sin comprimir:

         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

Respuesta3

Una alternativa a los métodos proporcionados por @Renan y @jimmij produce wireshark-filterel gran ganador en mi 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

En base a eso, abrí cada una de las entradas más grandes many verifiqué el número de líneas al final del archivo con a :fy obtuve:

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

Respuesta4

El ejemplo de @jimmij es interesante, pero incorrecto porque devuelve resultados de un solo subdirectorio. Al ejecutar ese script (en mi Debian 7), obtengo esto:

/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

Aquí hay una revisión rápida que soluciona ese 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

En mi sistema Debian 7 que da

/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 si sirve de algo, hay 10326 archivos /usr/share/manen esa máquina (ymmv).

información relacionada