Geçerli dizinin en az bir gizli olmayan dosya içerdiğini biliyorsanız:
set -- *; echo "$#"
Bu açıkça herhangi bir glob için genelleştirilebilir.
Bir komut dosyasında, bunun konumsal parametrelerin üzerine yazılmasının bazen talihsiz bir yan etkisi vardır. Bunu bir alt kabuk kullanarak veya şöyle bir fonksiyonla (Bourne / POSIX sürümü) çalıştırabilirsiniz:
count_words () {
eval 'shift; '"$1"'=$#'
}
count_words number_of_files *
echo "There are $number_of_files non-dot files in the current directory"
Alternatif bir çözümdür $(ls -d -- * | wc -l)
. Glob ise *
, komut kısaltılabilir $(ls | wc -l)
. Çıktısını ayrıştırmak ls
beni her zaman tedirgin ediyor, ancak burada dosya adlarınız yeni satırlar içermediği veya ls
kaçtığınız sürece çalışmalıdır . Ve $(ls -d -- * 2>/dev/null | wc -l)
(oysa, yani, bu, bu durumda 0 döndürür incelikle olmayan bir eşleştirme için defalarca talebi işleme avantajı vardır set *
topak boş olabilir, bu yöntem derinde test gerektirir).
Dosya adları yeni satır karakterleri içeriyorsa, bir alternatif kullanmaktır $(ls -d ./* | grep -c /)
.
Bir globun genişlemesini geçmeye dayanan bu çözümlerden herhangi biri , çok fazla eşleşen dosya varsa ls
, argüman listesi çok uzun bir hata ile başarısız olabilir .