결과를 "찾는" 가장 좋은 방법은 무엇입니까?
나의 현재 해결책은find <expr> -exec printf '.' \; | wc -c
하지만 10000개 이상의 결과가 있을 때는 너무 오래 걸립니다.이를 위한 더 빠른/더 나은 방법은 없습니까?
그거 좋지
find <expr> | wc -l
간단한 휴대용 솔루션으로?원래 솔루션은 새로운 프로세스를 생성하는 것입니다. printf
각 파일이 발견될 때마다 매우 많은 비용이 소요됩니다(방금 발견).
새 줄이 포함된 파일 이름이 있으면 이 값이 초과되지만, 새 줄이 포함된 경우 문제가 더 심각할 수 있습니다.
대신 사용해 보십시오(필수).find
의-printf
지원):
find <expr> -type f -printf '.' | wc -c
그것은 라인을 세는 것보다 더 신뢰할 수 있고 더 빠를 것입니다.
참고로 사용하는 것은find
의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 -> 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
줄 바꿈 문자가 포함된 파일 경로에 속지 않습니다. 최종 버전wc
NUL 바이트만 카운트):
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
'programing' 카테고리의 다른 글
Excel에서 중복 항목 수 계산 (0) | 2023.04.27 |
---|---|
이클립스의 빨간색 느낌표 아이콘은 무엇을 의미합니까? (0) | 2023.04.27 |
모든 선택 항목 사이의 차이점은 무엇입니까? (0) | 2023.04.27 |
Bash에 대한 인라인 댓글? (0) | 2023.04.27 |
Zure 웹 앱 배포 후 건설 중인 사이트 메시지를 가져오는 중 (0) | 2023.04.27 |