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

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

매뉴얼 페이지가 가장 긴 명령을 쉽게 찾을 수 있는 방법이 있습니까?

답변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

Info 페이지는 대부분 이해할 수 있는 Gnu 관련 항목에 대해 거대하지만, 예를 들어 zsh에는 맨 페이지보다 더 많은 줄과 단어가 있지만 문자는 적다는 점이 흥미로웠습니다. 얼핏 보면 내용은 동일하고 형식만 조금 다를 뿐이기 때문에 흥미롭습니다.


루프용 파일 선택 시 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): 고유한 단어만 표시합니다(이전 작업 후에는 동일한 단어가 많이 있습니다 - 동일한 정보 명령에 대해 다른 파일/챕터가 있음).

답변2

/usr/share/man/manX매뉴얼 페이지는 해당 X섹션( 에 설명되어 있음 ) 에 저장됩니다 man man. gzip 형식으로 압축되어 있으므로 압축 파일이 클수록 맨페이지도 커진다고 가정해 보겠습니다.

/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

이를 바탕으로 나는 가장 큰 항목을 각각 열고 a를 사용하여 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개의 파일이 있다는 것입니다.

관련 정보