Unix & Linux koridorlarında sessizce durursanız ve dikkatlice dinlerseniz, acımasızca ağlayan, “Yeni satırlar içeren dosya isimleri ne olacak?”
ls -d *snp* | wc -l
veya aynı şekilde ,
printf "%s\n" *snp* | wc -l
içeren çıktısı her dosya snp, her biri bir yeni satır, ardından
aynı zamanda dosya herhangi bir yeni satır da dahil olmak üzere , ve daha sonra çıktı hatlarının sayısı. Adı olan bir dosya varsa
f o o
s n p \n
b a r
. t s v
o zaman bu isim şöyle yazılır
foosnp
bar.tsv
elbette ki iki satır olarak sayılır.
En azından bazı durumlarda daha iyisini yapan birkaç alternatif var:
printf "%s\n" * | grep -c snp
içeren satırları sayar snp, bu nedenle foosnp(\n)bar.tsvyukarıdaki örnek yalnızca bir kez sayılır. Bu konuda küçük bir varyasyon
ls -f | grep -c snp
Yukarıdaki iki komut bundan farklıdır:
- Bu
ls -fad, adları ile başlayan dosyaları içerir .; kabuk seçeneği ayarlanmadığı printf … *sürece , bunu yapmaz dotglob.
printfbir kabuk yerleşiktir; lsharici bir komuttur. Bu nedenle, lsbiraz daha fazla kaynak kullanabilir.
- Kabuk a'yı işlediğinde
*dosya adlarını sıralar;
ls -fdosya adlarını sıralamaz. Bu nedenle, lsbiraz daha az kaynak kullanabilir.
Ancak ortak bir şeyleri var: İkisi de yeni satır içeren vesnp yeni satırdan önce ve sonra bulunan dosya adlarının varlığında yanlış sonuçlar verecektir .
Bir diğeri:
filenamelist=(*snp*)
echo ${#filenamelist[@]}
Bu, içeren tüm dosya adlarını listeleyen bir kabuk dizisi değişkeni oluşturur snpve sonra dizideki öğelerin sayısını bildirir. Dosya adları satır olarak değil, dize olarak ele alınır, bu nedenle katıştırılmış yeni satırlar sorun olmaz. Dizin çok büyükse bu yaklaşımın bir sorunu olabileceği düşünülebilir, çünkü dosya adları listesinin kabuk belleğinde tutulması gerekir.
Yine bir başka:
Daha önce, dediğimizde printf "%s\n" *snp*, printfkomut "%s\n", genişletme işlemindeki her bağımsız değişken için biçim dizesini bir kez tekrarladı (yeniden kullandı) *snp*. Burada, küçük bir değişiklik yapıyoruz:
printf "%.0s\n" *snp* | wc -l
Bu "%.0s\n", genişletme işlemindeki her bağımsız değişken için biçim dizesini bir kez tekrarlar (yeniden kullanır) *snp*. Ancak "%.0s", her dizenin ilk sıfır karakterini yazdırmak anlamına gelir - yani hiçbir şey. Bu printfkomut snp, adında bulunan her dosya için yalnızca yeni satır (yani boş satır) verir ; ve sonra wc -lonları sayar. Ve yine, .dosyaları ayarlayarak dahil edebilirsiniz dotglob.