user4556274 zaten cevap vardır neden . Benim cevabım için ek bilgi sağlamak amacıyla sunulduğunu nasıl düzgün dosyaları saymak.
Unix topluluğunda genel fikir birliği, çıktıların ayrıştırılmasının lsçok kötü bir fikir olduğu , çünkü dosya isimleri kontrol karakterlerini veya gizli karakterleri içerebilir. Örneğin, bir dosya adındaki yeni satır karakteri nedeniyle ls | wc -l, çıktısında 5 satır olduğunu söyleriz ls(aslında sahip olduğu), ancak gerçekte dizinde sadece 4 dosya vardır.
$> touch FILE$'\n'NAME
$> ls
file1.txt file2.txt file3.txt FILE?NAME
$> ls | wc -l
5
Yöntem 1: yardımcı programı bulma
findGenellikle yaklaşık çalışma dosya adlarını ayrıştırmak için kullanılan komut, yazdırarak Bize yardımcı olabilecek inode numarasını . Bir dizin veya dosya olsun, sadece benzersiz bir inode numarası var. Böylece, kullanarak -printf "%i\n"ve dışarıda .bırakarak -not -name "."dosyaların doğru bir sayımına sahip olabiliriz. ( -maxdepth 1Özyinelemeli alt dizinlere iniş önlemek için kullanımını unutmayın )
$> find -maxdepth 1 -not -name "." -print
./file2.txt
./file1.txt
./FILE?NAME
./file3.txt
$> find -maxdepth 1 -not -name "." -printf "%i\n" | wc -l
4
Yöntem 2: globstar
Basit, hızlı ve çoğunlukla taşınabilir yöntem:
$ set -- *
$ echo $#
228
setkomut, kabuğun konum parametrelerini ayarlamak için kullanılır ( $<INTEGER>değişkenler, olduğu gibi echo $1). Bu genellikle /bin/sheksik dizilerin sınırlandırılması etrafında çalışmak için kullanılır . Gille'in Unix ve Linux'taki cevabında ekstra kontroller yapan bir versiyonunu bulabilirsiniz .
bashKullanabileceğimiz dizileri destekleyen kabuklarda
items=( dir/* )
echo ${#items[@]}
steeldriver tarafından yorumlarda önerildiği gibi .
findKullanılan yönteme benzer bir numara wcve globstar, statsatır başına inode sayılarını saymak için kullanılabilir :
$> LC_ALL=C stat ./* --printf "%i\n" | wc -l
4
Alternatif bir yaklaşım, fordöngüde bir joker karakter kullanmaktır . (- 16 skinTenimde öğelerin doğrulanmış sayıdır Not, bu test bu yaklaşım değil mi, hangi alt dizinleri içine iner olmadığını test etmek için farklı bir dizin kullanır ~/bin)
$> count=0; for item in ~/bin/* ; do count=$(($count+1)) ; echo $count ; done | tail -n 1
16
Yöntem 3: diğer diller / tercümanlar
Python ayrıca, os.listdir()fonksiyonumun verdiği listenin uzunluğunu ( özyinelemeli olmayan ve sadece argüman olarak verilen dizindeki öğeleri listeleyecek şekilde) yazdırarak sorunlu dosya adlarıyla da başa çıkabilir .
$> python -c "import os ; print os.listdir('.')"
['file2.txt', 'file1.txt', 'FILE\nNAME', 'file3.txt']
$> python -c "import os ; print(len(os.listdir('.')))"
4
Ayrıca bakınız
ls | wc -lDosya adında yeni satır olan dosyalar varsa başarısız olur. Bu daha esnek:find . -mindepth 1 -maxdepth 1 -printf . | wc -c