[bash] “찾기”결과를 계산하는 가장 좋은 방법은 무엇입니까?

내 현재 솔루션은 find <expr> -exec printf '.' \; | wc -c이지만 10000 개 이상의 결과가있는 경우 너무 오래 걸립니다. 이 작업을 수행하는 더 빠르고 더 나은 방법이 없습니까?



답변

대신 이것을 시도하십시오 ( find-printf지원 필요 ) :

find <expr> -type f -printf '.' | wc -c

줄을 세는 것보다 더 안정적이고 빠릅니다.

외부 명령이 아닌 find‘s를 사용합니다 printf.


벤치를 조금 보자.

$ ls -1
a
e
l
ll.sh
r
t
y
z

내 스 니펫 벤치 마크 :

$ time find -type f -printf '.' | wc -c
8

real    0m0.004s
user    0m0.000s
sys     0m0.007s

전체 라인 :

$ time find -type f | wc -l
8

real    0m0.006s
user    0m0.003s
sys     0m0.000s

그래서 내 솔루션은 더 빠릅니다 =) (중요한 부분은 real라인입니다)


답변

왜 안돼

find <expr> | wc -l

간단한 휴대용 솔루션으로? 원래 솔루션은 발견 된 모든 개별 파일에 대해 새로운 프로세스 printf생성하고 있으며, 이는 매우 비쌉니다 (방금 찾은대로).

줄 바꿈이 포함 된 파일 이름이 있으면이 값이 과도하게 계산되지만 그게 있으면 문제가 조금 더 깊어 질 것 같습니다.


답변

이것은 내 countfiles기능입니다 ~/.bashrc(합리적으로 빠르며 Linux 및 FreeBSD find에서 작동해야하며 줄 바꿈 문자를 포함하는 파일 경로에 속지 않습니다. 마지막 wc은 NUL 바이트를 계산합니다) :

countfiles ()
{
   command find "${1:-.}" -type f -name "${2:-*}" -print0 |
       command tr -dc '\0' | command wc -c;
return 0
}

countfiles

countfiles ~ '*.txt'


답변

이 솔루션은 find -> wc여기 에있는 다른 솔루션 보다 확실히 느리지 만 파일 이름을 계산하는 것 외에도 파일 이름으로 다른 작업을 수행하려는 경우 출력 read에서 할 수 있습니다 find.

n=0
while read -r -d ''; do
    ((n++)) # count
    # maybe perform another act on file
done < <(find <expr> -print0)
echo $n

를 사용하여 출력 구분 기호를 NUL 바이트 로 만들고 루프 구분 기호로 (NUL 바이트)를 사용하여 읽음으로써 비표준 이름을 가진 파일을 올바르게 처리하는 BashGuide에서 발견 된 솔루션의 수정일뿐입니다 .findprint0''


답변