programing

결과를 "찾는" 가장 좋은 방법은 무엇입니까?

bestprogram 2023. 4. 27. 22:52

결과를 "찾는" 가장 좋은 방법은 무엇입니까?

나의 현재 해결책은find <expr> -exec printf '.' \; | wc -c하지만 10000개 이상의 결과가 있을 때는 너무 오래 걸립니다.이를 위한 더 빠른/더 나은 방법은 없습니까?

그거 좋지

find <expr> | wc -l

간단한 휴대용 솔루션으로?원래 솔루션은 새로운 프로세스를 생성하는 것입니다. printf각 파일이 발견될 때마다 매우 많은 비용이 소요됩니다(방금 발견).

새 줄이 포함된 파일 이름이 있으면 이 값이 초과되지만, 새 줄이 포함된 경우 문제가 더 심각할 수 있습니다.

대신 사용해 보십시오(필수).find-printf지원):

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

그것은 라인을 세는 것보다 더 신뢰할 수 있고 더 빠를 것입니다.

참고로 사용하는 것은findprintf외부 명령이 아닙니다.


잠시 벤치에 앉읍시다.

$ 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 -> wc여기에 해결책이 있지만, 파일 이름을 세는 것 외에 다른 것을 할 의향이 있다면, 당신은 할 수 있습니다.read에서find산출량.

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

이는 BashGuide에서 발견된 솔루션을 수정한 것일 뿐이며, 표준 이름이 아닌 파일을 적절하게 처리합니다.find출력 구분 기호NUL 바이트 사용print0그리고 그것으로부터 읽는 것을 사용합니다.''(NUL 바이트)를 루프 구분 기호로 사용합니다.

POSIX 호환 및 새로운 라인 보호:

find /path -exec printf %c {} + | wc -c

그리고, 내가 시험해 본 바로는./다른 솔루션보다 두 배도 느리지 않습니다. 새로운 라인을 지원하지 않거나 휴대할 수 없는 솔루션입니다.

참고:+대신에\;이는 성능에 매우 중요합니다.\;알을 낳다, 알을 낳다printf파일 이름당 명령 수, 반면+단일 파일에 가능한 한 많은 파일 이름을 제공합니다.printf명령. (그리고 인수가 너무 많은 경우, 찾기는 이에 대처하기 위해 요청 시 새로운 Printfs를 지능적으로 생성합니다.

{ 
  printf %c very long argument list1
  printf %c very long argument list2
  printf %c very long argument list3 
} | wc -c

호출되었습니다.)

이것은 나의countfiles내 기능~/.bashrc(Linux & FreeB에서 작동해야 하는 상당히 빠른 속도입니다.SDfind줄 바꿈 문자가 포함된 파일 경로에 속지 않습니다. 최종 버전wcNUL 바이트만 카운트):

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

countfiles

countfiles ~ '*.txt'

다른 명령도 실행되므로 검색에서 모든 출력을 가져올 수 없는 무언가가 필요했습니다.

임시 파일이 필요하지 않은 경우 다음과 같은 큰 주의 사항이 있어야만 이 작업이 가능합니다.출력 명령은 800~1600개 파일마다 한 번씩 실행되므로 두 줄 이상의 출력을 얻을 수 있습니다.

find . -print -exec sh -c 'printf %c "$@" | wc -c' '' '{}' + # just print the numbers
find . -print -exec sh -c 'echo "Processed `printf %c "$@" | wc -c` items."' '' '{}' +

다음 결과를 생성합니다.

Processed 1622 items.
Processed 1578 items.
Processed 1587 items.

다른 방법으로는 임시 파일을 사용할 수 있습니다.

find . -print -fprintf tmp.file .
wc -c <tmp.file # using the file as argument instead causes the file name to be printed after the count

echo "Processed `wc -c <tmp.file` items." # sh variant
echo "Processed $(wc -c <tmp.file) items." # bash variant

-print모든 찾기 명령은 카운트에 전혀 영향을 주지 않습니다.

언급URL : https://stackoverflow.com/questions/15663607/what-is-the-best-way-to-count-find-results