
Есть ли простой способ узнать, какая команда имеет самые длинные страницы руководства?
решение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
сохранить выше однострочный код в компактной форме:
$ 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 и всех подкаталогов. Файлы должны быть очищены от dirname, расширений и всех чисел. Вышеприведенный фрагмент можно переписать как ${(u)$(echo /usr/share/info/**/*(.)):t:r:r}
, что дает тот же результат, но использует, вероятно, более приличный синтаксис, а именно:
**/*
: спуститься во все подкаталоги и отметить там все(.)
: выбрать только простые файлы:t
: удалить компоненты имени пути (работает какbasename
):r
: удалить расширение (все после последней точки, включая точку). Применяется дважды, чтобы удалить также ненужную строку и число (например,.info-6
из файлаzsh.info-6.bz2
)(u)
: показывать только уникальные слова (после предыдущих операций осталось много одинаковых слов - разные файлы/главы для одной и той же команды info)
решение2
Страницы руководства хранятся в разделе /usr/share/man/manX
where (описано в ). Они сжаты в формате gzip, поэтому предположим, что больший сжатый файл означает большую страницу руководства.X
man man
Проверив /usr/share/man/man1
(раздел 1: Исполняемые программы или команды оболочки) с помощью команды gzip -l *.gz | sort -n -k2
, я получаю следующее (что, вероятно, будет отличаться от дистрибутива к дистрибутиву, это было в системе Arch Linux с кучей пакетов), где первый столбец — это размер сжатого файла, а второй столбец — размер несжатого файла:
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 интересен, но неверен, поскольку возвращает результаты только из одного подкаталога. Запустив этот скрипт (на моем 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
Если это имеет значение, то на этой машине (ymmv) находится 10326 файлов .