belirli bir dizindeki dizin sayısını sayma


103

Belirli bir dizindeki klasörlerin sayısı nasıl hesaplanır. Aşağıdaki komutu kullanıyorum, ancak her zaman fazladan bir tane sağlıyor.

find /directory/ -maxdepth 1 -type d -print| wc -l

Örneğin, 3 klasörüm varsa, bu komut 4 sağlar. 5 klasör içeriyorsa, komut 6 sağlar. Neden?


4
Ek 1 sayı, mevcut dizinden kaynaklanmaktadır '.' 'bul' tarafından da hesaba katılır.
patel deven

Yanıtlar:


94

find ayrıca dizinin kendisini yazdırıyor:

$ find .vim/ -maxdepth 1 -type d
.vim/
.vim/indent
.vim/colors
.vim/doc
.vim/after
.vim/autoload
.vim/compiler
.vim/plugin
.vim/syntax
.vim/ftplugin
.vim/bundle
.vim/ftdetect

Bunun yerine, yönetmenin çocuklarını test edebilir ve onlara hiç inmeyebilirsiniz:

$ find .vim/* -maxdepth 0 -type d
.vim/after
.vim/autoload
.vim/bundle
.vim/colors
.vim/compiler
.vim/doc
.vim/ftdetect
.vim/ftplugin
.vim/indent
.vim/plugin
.vim/syntax

$ find .vim/* -maxdepth 0 -type d | wc -l
11
$ find .vim/ -maxdepth 1 -type d | wc -l
12

Ayrıca şunları da kullanabilirsiniz ls:

$ ls -l .vim | grep -c ^d
11


$ ls -l .vim
total 52
drwxrwxr-x  3 anossovp anossovp 4096 Aug 29  2012 after
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 autoload
drwxrwxr-x 13 anossovp anossovp 4096 Aug 29  2012 bundle
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 colors
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 compiler
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 doc
-rw-rw-r--  1 anossovp anossovp   48 Aug 29  2012 filetype.vim
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 ftdetect
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 ftplugin
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 indent
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 plugin
-rw-rw-r--  1 anossovp anossovp 2505 Aug 29  2012 README.rst
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 syntax

$ ls -l .vim | grep ^d
drwxrwxr-x  3 anossovp anossovp 4096 Aug 29  2012 after
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 autoload
drwxrwxr-x 13 anossovp anossovp 4096 Aug 29  2012 bundle
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 colors
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 compiler
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 doc
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 ftdetect
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 ftplugin
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 indent
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 plugin
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 syntax

Güzel! Bunu $ ls -l .vimPHP ile nasıl yaparsınız ? Veya liste olmadan sadece toplamı nasıl elde edeceğinizi. Yani, bu durumda sadece olsun 52?
Pathros

Hah. PowerShell'e karşı argümanın BASH'in her yönden daha kolay olması hoşuma gidiyor ... Bunu yapmak için POSH komutunu görmek ister misiniz? (ls).Count
Kolob Canyon

@Pathros GLOB_ONLYDIR bayrağıyla glob kullanın ve sonucu sayın ().
Pilipe

1
ls -l | grep -c ^dçok basit ve işe yarıyor. @Pathros PHP'de muhtemelen daha iyi bir yol vardır, ancak PHP'de en kötü durum, komut satırını çalıştırmak ve sonuçları bir dizgeye döndürmek için her zaman shell_exec () işlevini kullanabilirsiniz. yani $dirCount = shell_exec('ls -l | grep -c ^d');
gigabayt

66

Yalnızca geçerli dizindeki dizinlerin sayısını alın

echo */ | wc

gibi çıkacaksın 1 309 4594

2nd digithayır temsil eder. dizinler.

veya

tree -L 1 | tail -1


8
Ne yazık ki, dizin adlarında boşluk varsa bu başarısız olur.
Michael Campbell

zsh: no matches found: */nullglob ihtiyacı
Anne van Rossum

@AnnevanRossum var mı echo. typewhich echo
EmptyData

7
İlki biraz daha geliştirilebilir:echo */ | wc -w
ibic

0 yerine dizin yoksa bunun 1 sayılacağına dikkat edin
jinawee

27
find . -mindepth 1 -maxdepth 1 -type d | wc -l

Bul -mindepth, dizinlerde kullanılabilen toplam sayı anlamına gelir

-maxdepth dizinlerdeki toplam sayı anlamına gelir

-type d dizin anlamına gelir

Ve wc -laraçlar için girdinin satırlarını sayın


2
Cevabınızı açıklar mısınız lütfen (cevabınızın içinde)?
Zulu

-mindepth, dizinlerde tekrar kullanılabilen toplam sayı anlamına gelir, -maxdepth, dizinlerde geri alınabilen toplam sayı anlamına gelir, -type d, dizin anlamına gelir ve wc -l, verilen dizin listesindeki satır sayısı anlamına gelir
shiyani,

find . -mindepth 1 -maxdepth 1 -type d | wc -lsayılar arasında size birçok boşluk verecektir, örneğin: `` 2 '' bunu kullanarak bunu önleyebilirsiniz: dir_count=`find . -maxdepth 1 -type d | wc -l | xargs`; echo $dir_count # will print just 2 ve aşağıdaki gibi koşullar için yararlı olabilir:if (( $dir_count > 1 )); then echo "Yaa"; fi # will print "Yaa"
naorz

16

Klasörde yalnızca dizinleriniz varsa ve dosya yoksa, bunu yapar:

ls | wc -l

2
Bu aynı zamanda dosyaları da alır, ancak soru klasörler / dizinler hakkındaydı.
Robert

12

Sürücünüze gitmenin ve basitçe çalıştırmanın en iyi yolu

ls -lR | grep ^d | wc -l

ve Alt dizinler dahil olmak üzere toplamda tüm klasörleri bul?

find /mount/point -type d | wc -l

... veya kök dizindeki tüm klasörleri bul (alt dizinler hariç)?

find /mount/point -maxdepth 1 -type d | wc -l

Şerefe!


Önceki Oradaki Not -lRederken nokta öneki dizini görmezden find -type d Eğer dizinleri önüne dot varsa ilk komutu tarafından verilen sayım them.So sayımı yanlış (örnek .git alt dizini var!). Basitçe kullanamazsınız -lRaçünkü her dizin için bir .ve ..girişi de alırsınız . Aynı zamanda @Pavel Anossov'un cevabı için de geçerlidir
marcz

12

Çalıştırın stat -c %h folderve sonuçtan 2 çıkarın. Bu, buradaki diğer çözümlerin çoğunun gerektirdiği (tipik olarak findartı wc) 2'nin (veya hatta 3'ün) aksine yalnızca tek bir alt işlem kullanır .

Sh / bash kullanma:

cnt = $ ((`stat -c% h klasör` - 2))
echo $ cnt # 'echo' bir sh / bash yerleşiktir, ek bir işlem değildir

Csh / tcsh kullanarak:

@ cnt = `stat -c% h klasör` - 2
echo $ cnt # 'echo' bir csh / tcsh yerleşiktir, ek bir işlem değildir


Açıklama: stat -c %h folderiçin sabit bağlantılarını sayısını yazdırır klasörüne ve altındaki her alt klasör klasöründe bir hardlink geri bir ../ girişi içerir klasöre . Sayıda iki ek sabit bağlantı olduğu için 2'yi çıkarmalısınız:

  1. klasörün kendi kendine referans ./ girişi ve
  2. klasörün üst öğesinin klasöre olan bağlantısı

Bu soruyla ilgili: [Yeni bir dizine herhangi bir şey eklenmeden önce neden 2 sabit bağlantı sayısı var? ] ( unix.stackexchange.com/questions/101515 ) Bunun neden mükemmel bir cevap olduğunu açıklıyor. Ne yazık ki, bu yeterince ilgi görmedi! İyi bir cevap olsa da, sonucu maalesef dosya sistemine bağlıdır, ancak en yaygın dosya sistemleri için bu işe yarayacaktır.
kvantour

8

Bence en kolayı

  ls -ld images/* | wc -l

imageshedef dizininiz nerede . -D bayrağı dizinlerle sınırlıdır ve -l bayrağı, wc -lsatır sayımı için çok bilindik olanla uyumlu bir satır başına listeleme gerçekleştirir .


Ayrıca sonuç +1
josef,

1
Göre man ls, -dyapar: "liste dizinleri kendileri değil içerikleri" koşarsan, olduğunu, ls /tmp, sen içinde ne alırsınız /tmpve koşarsan ls -d /tmpseni sadece olsun /tmp. -dİçin istendi olarak anahtar dizinleri filtre uygulamaz.
Robert

5

Bazı yararlı örnekler:

geçerli dizindeki dosyaları say

/bin/ls -lA  | egrep -c '^-'

geçerli dizindeki dizinleri say

/bin/ls -lA  | egrep -c '^d'

geçerli dizindeki dosyaları ve dizinleri say

/bin/ls -lA  | egrep -c '^-|^d'

tek bir alt dizindeki dosyaları ve dizinleri say

/bin/ls -lA  subdir_name/ | egrep -c '^-|^d'

Garip bir şey fark ettim (en azından benim durumumda):

Birlikte çalıştık zaman lsyerine parametre DEĞİL İŞ espected. O şovu kullandığımda ./ ve ../ Yani sonuç yanlış sayılır. ÇÖZÜM: onun yerine/bin/ls-Ado not list implied . and ..ls/bin/lsls


4

Aşağıdaki komutu kullanarak bulamayacağımız hiçbir dizin

ls -l | grep "^d" | wc -l


Sadece ls -l | grep ^d | wc -lyapacak, burada kullanmaya gerek "yok
kaspiotr

3

Saf bir bash çözümü:

shopt -s nullglob
dirs=( /path/to/directory/*/ )
echo "There are ${#dirs[@]} (non-hidden) directories"

Gizli dizinleri de saymak istiyorsanız:

shopt -s nullglob dotglob
dirs=( /path/to/directory/*/ )
echo "There are ${#dirs[@]} directories (including hidden ones)"

Bunun dizinlere olan bağlantıları da sayacağını unutmayın. Bunu istemiyorsanız, bu yöntemle biraz daha zor.


Kullanarak find:

find /path/to/directory -type d \! -name . -prune -exec printf x \; | wc -c

İşin püf noktası, xher dizin bulunduğunda stdout'a bir çıktı vermek ve ardından wckarakter sayısını saymak için kullanmaktır . Bu, bağlantılar hariç tüm dizinlerin (gizli olanlar dahil) sayısını sayacaktır.


Burada sunulan yöntemlerin tümü, dosya adlarında (boşluklar, satırsonları, glob karakterleri, vb.) Görünebilecek komik karakterler için güvenlidir.


Bu soruda sunulan en iyi çözüm budur ve her zaman işe yarayacaktır!
kvantour

3

Kullanarak zsh:

a=(*(/N)); echo ${#a}

NBir nullglob olan /bu dizinleri maç yapar #sayar. Dizin isimlerindeki boşluklarla düzgün bir şekilde başa çıkacak ve dizin 0yoksa geri dönecektir .


0

Tüm dosyaları ve alt klasörleri sayın, Windows stili:

dir=/YOUR/PATH;f=$(find $dir -type f | wc -l); d=$(find $dir -mindepth 1 -type d | wc -l); echo "$f Files, $d Folders"

0

Normal ifadeler kullanmak istiyorsanız şunu deneyin:

ls -c | grep "^d" | wc -l

1
Yalnızca kod yanıtınıza bir açıklama eklemek ister misiniz? StackOverflow'un ücretsiz bir kod yazma hizmeti olduğu yanılgısıyla mücadeleye yardımcı olacaktır. Ayrıca, görünümü iyileştirmek için buraya bir göz atın: stackoverflow.com/editing-help
Yunnosch

0

İstediğiniz şeye en iyi cevap

echo `find . -maxdepth 1 -type d | wc -l`-1 | bc

bu, istenmeyen '' kaldırmak için birini çıkarır. listeleri bulan dizin (yukarıda bahsedilen patel deven gibi).

Alt klasörleri yinelemeli olarak saymak istiyorsanız, maxdepth seçeneğini devre dışı bırakın.

echo `find . -type d | wc -l`-1 | bc

PS Eğer komut ikamesini çirkin bulursanız, birini çıkarmak sedve kullanarak saf bir akım olarak yapılabilir bc.

Count'tan bir çıkarma:

find . -maxdepth 1 -type d | wc -l | sed 's/$/-1\n/' | bc

veya eksi bire sayı ekleyerek:

find . -maxdepth 1 -type d | wc -l | sed 's/^/-1+/' | bc

-1

Bunu yapmanın en iyi yolu:

ls -la | grep -v total | wc -l

Bu size mükemmel sayımı verir.


6
Yani bunu yapmanın en kötü yolu bu! ayrıca, bu dizinlerin sayısını saymaz . Peki ya dizeyi içeren bir dizin adı varsa total? yönteminiz bozuldu :(. Ayrıştırmals !
gniourf_gniourf
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.