드물게 디렉토리의 파일 수를 세어야 할 필요는 없으며 때로는 수백만에 달합니다.
그냥 열거하고 계산하는 것보다 더 좋은 방법이 find . | wc -l
있습니까? ext3 / 4에서 I / O 집약도가 낮은 파일 시스템 호출이 있습니까?
find -maxdepth 1
. 현재 접근 방식에서는 개행 문자가 포함 된 이름을 두 번 계산합니다.
드물게 디렉토리의 파일 수를 세어야 할 필요는 없으며 때로는 수백만에 달합니다.
그냥 열거하고 계산하는 것보다 더 좋은 방법이 find . | wc -l
있습니까? ext3 / 4에서 I / O 집약도가 낮은 파일 시스템 호출이 있습니까?
find -maxdepth 1
. 현재 접근 방식에서는 개행 문자가 포함 된 이름을 두 번 계산합니다.
답변:
기본 속도 향상은 아니지만 최소한 :)
find . -printf \\n | wc -l
실제로 파일 이름 목록을 전달할 필요는 없으며 개행만으로 충분합니다. 이 변형은 디렉토리가 RAM에 캐시 될 때 우분투 12.04.3에서 약 15 % 빠릅니다. 또한이 변형은 개행을 포함하는 파일 이름에서 올바르게 작동합니다.
흥미롭게도이 변종은 위의 것보다 약간 느린 것 같습니다.
find . -printf x | wc -c
디렉토리가 자체 파일 시스템에있는 경우 간단히 inode를 계산할 수 있습니다.
df -i .
계산 된 것 이외의 다른 디렉토리에있는 디렉토리 및 파일의 수가 크게 변하지 않으면 현재 df -i
결과 에서이 알려진 숫자를 빼기 만하면 됩니다. 이 방법으로 파일과 디렉토리를 매우 빠르게 계산할 수 있습니다.
time find /usr/src/ -printf \\n | wc -l
을 사용하여 실행 사이에 캐시를 지울 수 있습니다.sudo sync && sudo sysctl -w vm.drop_caches=3
-printf x
와 동일하게 의미 -printf '\0'
? 문서에 언급되어 있지 않습니다.
-printf
은 지시문의 의미가 printf()
다르다는 주요 차이점을 제외하고 C 의 함수 와 유사하게 작동 %
합니다. 발견 된 모든 파일에 대해 조치가 호출됩니다. 즉, 발견 된 모든 파일에 -printf x
대해 문자 x
를 인쇄하고 (시도하십시오!) 발견 된 모든 파일에 -printf '\0'
대해 문자 NULL (ASCII 코드 0)을 인쇄합니다. -printf '\0'
특별한 의미가 없습니다. wc -c
이 답변 의 예에서 두 가지 모두 동일하게 작동합니다 .
나는 그 목적을 위해 ffcnt 를 썼습니다 . fiemap
ioctl을 사용하여 디렉토리 자체의 실제 오프셋을 검색 한 다음 무작위 순차 액세스를 줄이기 위해 여러 순차 패스에서 디렉토리 순회를 스케줄링합니다. 실제로 속도 향상 find | wc
여부는 몇 가지 요인 에 따라 다릅니다.
fiemap
ioctl 을 지원하는 ext4와 같은 파일 시스템 이 가장 유리합니다.(재) 마운트가 메타 데이터 업데이트를 유발할 경우 속도를 향상 시키 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
/bin/ls: Argument list too long
globbing을 사용하는 경우 와 같이 종종 무언가를 반환 하지만 다시 찾기와 같이 재귀 적으로 작동 할 수 있다는 것입니다.
ls -A
, 현재 디렉토리에있는 파일 만 나열하면 인수 find
없이 -maxdepth 1
모든 하위 디렉토리를 재귀 적으로 검색합니다.