내 현재 솔루션은 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에서 발견 된 솔루션의 수정일뿐입니다 .find
print0
''