내 시스템에서 어떤 명령이 가장 긴 매뉴얼을 가지고 있는지 어떻게 알 수 있나요?

내 시스템에서 어떤 명령이 가장 긴 매뉴얼을 가지고 있는지 어떻게 알 수 있나요?

어떤 명령의 매뉴얼 페이지가 가장 긴지 쉽게 알아낼 수 있는 방법이 있습니까?

답변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에는 맨 페이지보다 행과 단어가 많지만 문자는 적다는 점이 흥미롭습니다. 얼핏 보면 내용은 동일하고 형식만 조금 다르기 때문에 흥미롭습니다.


루프 파일 선택 시 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: 확장명(점을 포함하여 마지막 점 뒤의 모든 내용)을 제거합니다. 불필요한 문자열과 숫자를 제거하기 위해 두 번 적용됩니다(예: .info-6파일에서 zsh.info-6.bz2).
  • (u): 고유한 단어만 표시합니다(이전 작업 이후 동일한 단어가 많음 - 동일한 정보 명령에 대해 다른 파일/챕터).

답변2

/usr/share/man/manX매뉴얼 페이지는 이 섹션의 위치 에 저장됩니다 (참고자료에 설명되어 있음). gzip 형식으로 압축되어 있으므로 압축 파일이 클수록 맨페이지도 커진다고 가정합니다.Xman 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파일 끝의 줄 수를 a로 확인하여 :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이 컴퓨터에는 10326개의 파일(ymmv)이 있습니다.

관련 정보