Giải pháp hiện tại của tôi sẽ là find <expr> -exec printf '.' \; | wc -c
, nhưng điều này mất quá nhiều thời gian khi có hơn 10000 kết quả. Không có cách nào nhanh hơn / tốt hơn để làm điều này?
Câu trả lời:
Hãy thử điều này thay vì (yêu cầu find
's -printf
hỗ trợ):
find <expr> -type f -printf '.' | wc -c
Nó sẽ đáng tin cậy hơn và nhanh hơn so với việc đếm các dòng.
Lưu ý rằng tôi sử dụng lệnh find
's printf
, không phải lệnh bên ngoài.
Hãy băng ghế một chút:
$ ls -1
a
e
l
ll.sh
r
t
y
z
Điểm chuẩn đoạn mã của tôi:
$ time find -type f -printf '.' | wc -c
8
real 0m0.004s
user 0m0.000s
sys 0m0.007s
Với đầy đủ các dòng:
$ time find -type f | wc -l
8
real 0m0.006s
user 0m0.003s
sys 0m0.000s
Nên cách giải của mình nhanh hơn =) (phần quan trọng là real
dòng)
-printf '.'
Tại sao không
find <expr> | wc -l
như một giải pháp di động đơn giản? Giải pháp ban đầu của bạn đang tạo ra một quy trình mới printf
cho mọi tệp riêng lẻ được tìm thấy và điều đó rất tốn kém (như bạn vừa tìm thấy).
Lưu ý rằng điều này sẽ vượt quá nếu bạn có các tên tệp có nhúng dòng mới, nhưng nếu bạn có tên tệp đó thì tôi nghi ngờ sự cố của bạn sẽ sâu hơn một chút.
Đây là countfiles
chức năng của tôi trong của tôi ~/.bashrc
(nó khá nhanh, hoạt động cho Linux & FreeBSD find
và không bị đánh lừa bởi các đường dẫn tệp chứa các ký tự dòng mới; cuối cùng wc
chỉ tính NUL byte):
countfiles ()
{
command find "${1:-.}" -type f -name "${2:-*}" -print0 |
command tr -dc '\0' | command wc -c;
return 0
}
countfiles
countfiles ~ '*.txt'
Giải pháp này chắc chắn chậm hơn một số find -> wc
giải pháp khác ở đây, nhưng nếu bạn có xu hướng làm điều gì đó khác với tên tệp ngoài việc đếm chúng, bạn có thể read
từ find
đầu ra.
n=0
while read -r -d ''; do
((n++)) # count
# maybe perform another act on file
done < <(find <expr> -print0)
echo $n
Nó chỉ là một sửa đổi của một giải pháp được tìm thấy trong BashGuide để xử lý đúng cách các tệp có tên không chuẩn find
bằng cách sử dụng dấu phân cách đầu ra thành byte NUL print0
và đọc từ đó bằng cách sử dụng ''
(byte NUL) làm dấu phân cách vòng lặp.