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
find
Genellikle 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
set
komut, kabuğun konum parametrelerini ayarlamak için kullanılır ( $<INTEGER>
değişkenler, olduğu gibi echo $1
). Bu genellikle /bin/sh
eksik 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 .
bash
Kullanabileceğimiz dizileri destekleyen kabuklarda
items=( dir/* )
echo ${#items[@]}
steeldriver tarafından yorumlarda önerildiği gibi .
find
Kullanılan yönteme benzer bir numara wc
ve globstar, stat
satı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, for
dö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 -l
Dosya adında yeni satır olan dosyalar varsa başarısız olur. Bu daha esnek:find . -mindepth 1 -maxdepth 1 -printf . | wc -c