Çok sayıda dosya içeren bir dizinim var. Sayımı sağlamak için bir ls
anahtarı göremiyorum. Dosyaların sayısını almak için bir komut satırı sihri var mı?
Geniş bir "dosya" tanımı kullanarak;
ls | wc -l
(gizli dosyaları saymadığını ve dosya adlarının yeni satır karakterleri içermediğini varsaydığını unutmayın).
Gizli dosyaları (.
ve ..
hariç) dahil etmek ve satırsonu karakterleriyle ilgili sorunlardan kaçınmak için kanonik yol şudur:
find . ! -name . -prune -print | grep -c /
Ya da özyinelemeli olarak:
find .//. ! -name . -print | grep -c //
Dosyanın dar tanımı için:
find . -maxdepth 1 -type f | wc -l
Geçerli dizinin gizli olmayan en az bir dosya içerdiğini biliyorsanız:
set -- *; echo "$#"
Bu açıkça herhangi bir glob için genelleştirilebilir.
Bir kodda, bunun bazen konumsal parametrelerin üzerine yazılması gibi talihsiz bir yan etkisi vardır. Bunu bir alt kabuk kullanarak veya aşağıdaki gibi bir işlevle (Bourne/POSIX sürümü) aşabilirsiniz:
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üm $(ls -d -- * | wc -l)
şeklindedir. Eğer glob *
ise, komut $(ls | wc -l)
şeklinde kısaltılabilir. lskomutunun çıktısını ayrıştırmak beni her zaman tedirgin eder, ancak burada dosya adlarınız yeni satırlar içermediği veya
lskomutunuz bunlardan kaçtığı sürece çalışmalıdır. Ve
$(ls -d -- 2>/dev/null | wc -l), eşleşmeyen bir glob durumunu incelikle ele alma avantajına sahiptir (yani, bu durumda 0 döndürür, oysa
set ` yöntemi globun boş olup olmadığını zahmetli bir şekilde test etmeyi gerektirir).
Dosya adları satırsonu karakterleri içerebiliyorsa, alternatif olarak $(ls -d ./* | grep -c /)
kullanılır.
Bir glob'un genişlemesini `ls'ye aktarmaya dayanan bu çözümlerden herhangi biri, çok sayıda eşleşen dosya varsa argument list too long hatasıyla başarısız olabilir.