드물게 디렉토리의 파일 수를 세어야 할 필요는 없으며 때로는 수백만에 달합니다.
그냥 열거하고 계산하는 것보다 더 좋은 방법이 find . | wc -l
있습니까? ext3 / 4에서 I / O 집약도가 낮은 파일 시스템 호출이 있습니까?
답변
기본 속도 향상은 아니지만 최소한 🙂
find . -printf \\n | wc -l
실제로 파일 이름 목록을 전달할 필요는 없으며 개행만으로 충분합니다. 이 변형은 디렉토리가 RAM에 캐시 될 때 우분투 12.04.3에서 약 15 % 빠릅니다. 또한이 변형은 개행을 포함하는 파일 이름에서 올바르게 작동합니다.
흥미롭게도이 변종은 위의 것보다 약간 느린 것 같습니다.
find . -printf x | wc -c
특별한 경우-그러나 정말 빠릅니다
디렉토리가 자체 파일 시스템에있는 경우 간단히 inode를 계산할 수 있습니다.
df -i .
계산 된 것 이외의 다른 디렉토리에있는 디렉토리 및 파일의 수가 크게 변하지 않으면 현재 df -i
결과 에서이 알려진 숫자를 빼기 만하면 됩니다. 이 방법으로 파일과 디렉토리를 매우 빠르게 계산할 수 있습니다.
답변
나는 그 목적을 위해 ffcnt 를 썼습니다 . fiemap
ioctl을 사용하여 디렉토리 자체의 실제 오프셋을 검색 한 다음 무작위 순차 액세스를 줄이기 위해 여러 순차 패스에서 디렉토리 순회를 스케줄링합니다. 실제로 속도 향상 find | wc
여부는 몇 가지 요인 에 따라 다릅니다.
- 파일 시스템 유형 :
fiemap
ioctl 을 지원하는 ext4와 같은 파일 시스템 이 가장 유리합니다. - 랜덤 액세스 속도 : HDD는 SSD보다 훨씬 많은 이점을 제공합니다
- 디렉토리 레이아웃 : 중첩 된 디렉토리의 수가 많을수록 최적화 가능성이 높아짐
(재) 마운트가 메타 데이터 업데이트를 유발할 경우 속도를 향상 시키 relatime
거나 nodiratime
모든 방법에서 속도를 향상시킬 수도 있습니다.
답변
실제로 내 시스템 (Arch Linux)에서이 명령
ls -A | wc -l
위의 모든 것보다 빠릅니다.
$ time find . | wc -l
1893
real 0m0.027s
user 0m0.004s
sys 0m0.004s
$ time find . -printf \\n | wc -l
1893
real 0m0.009s
user 0m0.000s
sys 0m0.008s
$ time find . -printf x | wc -c
1893
real 0m0.009s
user 0m0.000s
sys 0m0.008s
$ time ls -A | wc -l
1892
real 0m0.007s
user 0m0.000s
sys 0m0.004s