파일 번호의 계단식 트리

파일 번호의 계단식 트리

표준 출력에는 tree파일 계층 구조에 대한 정보가 포함됩니다. 이 도구에는 이를 수행하는 옵션이 포함되어 있습니다. 여기서 크기는 모든 파일의 크기를 추가하고 tree --du -h큰 디렉터리를 검색할 수 있는 폴더( )만 표시합니다.

나는 같은 것을 찾고 있지만 수십만 개의 파일이 포함된 큰 트리에서 그다지 크지 않은 디렉터리에 대한 핫스팟을 찾기 위해 파일 수를 찾고 있습니다.

답변1

불가능해 보이지만 tree다음과 같이 할 수 있습니다.

느린 버전

find . -type d -exec bash -c 'printf "%7d   " '\
'$(find "$1" -mindepth 1 -maxdepth 1 -type f -not -type l -printf . | wc -m); '\
'printf "%s\n" "$1"' find {} \; 2>/dev/null |
awk '$1>1000'

파일 번호(이 경우 1,000보다 큰 파일 번호만)와 디렉터리 경로를 인쇄합니다.

내 /etc(파일 개수 임계값은 50)에서 실행하면 출력은 다음과 같습니다.

    175   .
     70   ./sysconfig
     98   ./apparmor.d/abstractions
     84   ./gconf/gconf.xml.schemas
    122   ./brltty/Text
     76   ./sane.d

익스프레스 버전

bu5hman의 답변을 통해 이것이 얼마나 느린지 깨닫지 못했다는 것을 깨달았습니다.

다음은 또 다른 접근 방식의 최적화된 버전입니다.

find . -type f -not -type l -printf '%h\n' 2>/dev/null |
  awk -v th=50 '{ a[$0]++; }; '\
  'END { PROCINFO["sorted_in"]="@unsorted"; for (key in a) if (a[key]<th) delete a[key];'\
  ' PROCINFO["sorted_in"]="@val_num_desc";for (key in a) printf "%7d   %s\n",a[key],key }'
    175   .
    122   ./brltty/Text
     98   ./apparmor.d/abstractions
     84   ./gconf/gconf.xml.schemas
     76   ./sane.d
     70   ./sysconfig

awk필터링할 수 있을 뿐만 아니라 계산하고 정렬할 수도 있습니다. 계산, 필터링, 정렬 등 올바른 순서로 이 작업을 수행합니다. 그리고 정렬, 카운트, 파일러가 최악입니다. 물론 이는 디렉토리 번호가 큰 경우에만 중요합니다.

  1. 다수의 프로세스가 소량의 데이터를 이동하고
  2. 소량 또는 프로세스로 더 많은 데이터 이동

/etc에 400개 이상의 디렉토리가 있고 하위 프로세스의 페이지 캐시 적중률이 (아마도) 100%인 경우에도 이는 여전히 매우 인상적입니다.

답변2

원래의

-type관심 있는 파일 시스템을 한 번만 스캔한 다음 포함된 폴더와 개수별로 집계하면 됩니다.

find . -type f ! -type l 2>/dev/null | sed "s|/[^/]*$||g" | sort | uniq -c | awk '$1>=1000'

/etcbase@threshold 50 사용

    109 .
     96 ./apparmor.d/abstractions
    138 ./ca-certificates/extracted/cadir
     64 ./fonts/conf.avail
     81 ./sane.d
     58 ./xdg

real    0m0.014s
user    0m0.015s
sys     0m0.018s

방첩 에디션

전쟁이 터진 것 같았기 때문에 무기고를 최적화해야겠다고 생각했고, 전시 방첩의 최고의 전통에 따라 %h\n뻔뻔한 절도를 저질렀습니다.

find . -type f ! -type l -printf '%h\n' 2>/dev/null | 
   awk '{dir[$1]++}
        END{for (d in dir) if (dir[d] >=50) print dir[d], d}'|
   sort -g

58 ./xdg
64 ./fonts/conf.avail
81 ./sane.d
96 ./apparmor.d/abstractions
109 .
138 ./ca-certificates/extracted/cadir

real    0m0.006s
user    0m0.005s
sys     0m0.005s

이 작업의 실행 시간은 작은 디렉터리에 대한 중요한 바운스보다 짧고 전체(2TB) 파일 시스템이 약 1.5초 안에 처리되므로 타이핑 오버헤드가 즉석에서 한 줄을 작성하는 데 도움이 된다고 생각합니다.

나는 Glorious @haukelaging 솔루션의 놀라운 속도를 진심으로 존경하지만

;)

포스트 스크립트내 전체 FS

모이

real    0m1.481s
user    0m0.975s
sys     0m0.805s

도이

real    0m1.586s
user    0m1.069s
sys     0m0.843s

관련 정보