Bất cứ điều gì liên quan ls
đều có khả năng tạo ra kết quả bất ngờ với ký tự đặc biệt (không gian và các biểu tượng khác). Bất kỳ bashism (như mảng) không thể di động. Bất cứ điều gì liên quan while read
thường là chậm.
Mặt khác, find
RẤT linh hoạt (rất nhiều tùy chọn để lọc), nó có [ít nhất] hai cú pháp không an toàn cho các ký tự đặc biệt ... và nó có tỷ lệ tốt trên thư mục lớn.
Trong ví dụ này, tôi đã sử dụng -iname
để khớp cả tên mở rộng chữ hoa và chữ thường. Tôi cũng đã hạn chế việc -maxdepth 1
tôn trọng "trong thư mục hiện tại" của bạn. Thay vì đếm số lượng dòng, trong đó tên tệp có thể bao gồm CR / LF, -print0
sẽ in một byte NULL ở cuối mỗi tên tệp ... vì vậy, | tr -d -c "\000" | wc -l
việc đếm chính xác các tệp (byte NULL!).
extensions="jpg png gif"
for ext in $extensions; do
c=$(find . -maxdepth 1 -iname "*.$ext" -print0 | tr -d -c "\000" | wc -c)
if [ $c -gt 0 ]; then
echo "Found $c *.$ext files"
find . -maxdepth 1 -iname "*.$ext" -print0 | xargs -0 -r -n1 DOSOMETHINGHERE
# or # find . -maxdepth 1 -iname "*.$ext" -exec "ls" "-l" "{}" ";"
fi
done
PS -print0 | tr -d -c "\000" | wc -c
có thể được thay thế bằng -printf "\000" | wc -c
hoặc thậm chí -printf '\n' | wc -l
.