![파일 번호의 계단식 트리](https://linux55.com/image/171858/%ED%8C%8C%EC%9D%BC%20%EB%B2%88%ED%98%B8%EC%9D%98%20%EA%B3%84%EB%8B%A8%EC%8B%9D%20%ED%8A%B8%EB%A6%AC.png)
표준 출력에는 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
필터링할 수 있을 뿐만 아니라 계산하고 정렬할 수도 있습니다. 계산, 필터링, 정렬 등 올바른 순서로 이 작업을 수행합니다. 그리고 정렬, 카운트, 파일러가 최악입니다. 물론 이는 디렉토리 번호가 큰 경우에만 중요합니다.
- 다수의 프로세스가 소량의 데이터를 이동하고
- 소량 또는 프로세스로 더 많은 데이터 이동
/etc에 400개 이상의 디렉토리가 있고 하위 프로세스의 페이지 캐시 적중률이 (아마도) 100%인 경우에도 이는 여전히 매우 인상적입니다.
답변2
원래의
-type
관심 있는 파일 시스템을 한 번만 스캔한 다음 포함된 폴더와 개수별로 집계하면 됩니다.
find . -type f ! -type l 2>/dev/null | sed "s|/[^/]*$||g" | sort | uniq -c | awk '$1>=1000'
/etc
base@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