Nếu bạn biết thư mục hiện tại chứa ít nhất một tệp không bị ẩn:
set -- *; echo "$#"
Điều này rõ ràng là khái quát cho bất kỳ toàn cầu.
Trong một kịch bản, điều này đôi khi có tác dụng phụ đáng tiếc là ghi đè các tham số vị trí. Bạn có thể giải quyết vấn đề đó bằng cách sử dụng một lớp con hoặc với một chức năng (phiên bản Bourne / POSIX) như:
count_words () {
eval 'shift; '"$1"'=$#'
}
count_words number_of_files *
echo "There are $number_of_files non-dot files in the current directory"
Một giải pháp thay thế là $(ls -d -- * | wc -l)
. Nếu toàn cầu là *
, lệnh có thể được rút ngắn thành $(ls | wc -l)
. Phân tích cú pháp đầu ra ls
luôn khiến tôi khó chịu, nhưng ở đây nó sẽ hoạt động miễn là tên tệp của bạn không chứa dòng mới hoặc bạn ls
thoát chúng. Và $(ls -d -- * 2>/dev/null | wc -l)
có lợi thế xử lý trường hợp của một quả cầu không khớp một cách duyên dáng (nghĩa là nó trả về 0 trong trường hợp đó, trong khi set *
phương thức yêu cầu kiểm tra một cách khéo léo nếu quả cầu có thể trống).
Nếu tên tệp có thể chứa các ký tự dòng mới, một cách khác là sử dụng $(ls -d ./* | grep -c /)
.
Bất kỳ giải pháp nào dựa vào việc vượt qua việc mở rộng toàn cầu đều ls
có thể thất bại với danh sách đối số lỗi quá dài nếu có nhiều tệp phù hợp.