menghitung jumlah direktori dalam direktori tertentu


103

Bagaimana menghitung jumlah folder dalam direktori tertentu. Saya menggunakan perintah berikut, tetapi selalu memberikan perintah tambahan.

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

Misalnya, jika saya memiliki 3 folder, perintah ini menyediakan 4. Jika berisi 5 folder, perintah tersebut menyediakan 6. Mengapa demikian?


4
Jumlah 1 tambahan ada di sana karena direktori saat ini '.' , yang juga diperhitungkan oleh 'temukan'.
patel deven

Jawaban:


94

find juga mencetak direktori itu sendiri:

$ 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

Sebagai gantinya, Anda dapat menguji turunan direktori dan tidak turun ke dalamnya sama sekali:

$ 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

Anda juga bisa menggunakan 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

Bagus! Bagaimana Anda melakukan ini $ ls -l .vimdengan PHP? Atau bagaimana cara mendapatkan totalnya saja, tanpa daftar. Maksud saya, dalam hal ini dapatkan saja 52?
Pathros

Hah. Saya suka bagaimana argumen melawan PowerShell adalah bahwa BASH lebih mudah dalam segala hal ... ingin melihat perintah POSH untuk melakukan ini? (ls).Count
Kolob Canyon

@Pathros Gunakan glob dengan flag GLOB_ONLYDIR dan hitung () hasilnya.
Pilipe

1
ls -l | grep -c ^dsangat sederhana dan berhasil. @Pathros mungkin ada cara yang lebih baik di PHP, tetapi kasus terburuk di PHP Anda selalu dapat menggunakan fungsi shell_exec () untuk menjalankan baris perintah dan mengembalikan hasil ke string. yaitu $dirCount = shell_exec('ls -l | grep -c ^d');
gigabyte

66

Dapatkan hitungan hanya direktori di direktori saat ini

echo */ | wc

Anda akan keluar seperti 1 309 4594

2nd digitmewakili no. direktori.

atau

tree -L 1 | tail -1


8
Sayangnya, ini gagal jika ada spasi di nama dir.
Michael Campbell

zsh: no matches found: */membutuhkan nullglob
Anne van Rossum

@AnnevanRossum Apakah Anda punya echo. ketikwhich echo
EmptyData

7
Yang pertama bisa lebih ditingkatkan sedikit:echo */ | wc -w
ibic

Catatan bahwa ini akan menghitung 1 jika tidak ada direktori, bukan 0.
jinawee

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

Untuk menemukan -mindepthberarti jumlah total recusive di direktori

-maxdepth berarti jumlah total recusive di direktori

-type d berarti direktori

Dan untuk wc -lcara menghitung garis input


2
Bisakah Anda menjelaskan jawaban Anda (di dalam jawaban Anda)?
Zulu

-mindepth berarti jumlah total recusive di direktori, -maxdepth berarti jumlah total recusive di direktori, -type d berarti direktori, dan wc -l berarti jumlah baris dari daftar direktori yang diberikan
shiyani suresh

find . -mindepth 1 -maxdepth 1 -type d | wc -lakan memberi Anda banyak spasi di antara angka tersebut, misalnya: `` 2 `Anda dapat mencegahnya dengan menggunakan ini: dir_count=`find . -maxdepth 1 -type d | wc -l | xargs`; echo $dir_count # will print just 2 dan dapat berguna untuk kondisi, seperti:if (( $dir_count > 1 )); then echo "Yaa"; fi # will print "Yaa"
naorz

16

Jika Anda hanya memiliki direktori di folder dan tidak ada file, ini melakukannya:

ls | wc -l

2
Ini juga mendapat file, tetapi pertanyaannya adalah tentang folder / direktori.
Robert

12

Cara terbaik untuk menavigasi ke drive Anda dan cukup jalankan

ls -lR | grep ^d | wc -l

dan untuk menemukan semua folder secara total, termasuk subdirektori?

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

... atau temukan semua folder di direktori root (tidak termasuk subdirektori)?

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

Bersulang!


Perhatikan bahwa ls sebelumnya -lRmengabaikan direktori yang diawali titik sambil find -type d menghitungnya. Jadi hitungan yang diberikan oleh perintah pertama salah jika Anda memiliki direktori yang diawali titik (misalnya Anda memiliki subdirektori .git!). Anda tidak bisa begitu saja menggunakan -lRakarena Anda juga mendapatkan untuk setiap direktori .dan ..entri. Ini juga berlaku untuk jawaban @Pavel Anossov
marcz

12

Jalankan stat -c %h folderdan kurangi 2 dari hasilnya. Ini hanya menggunakan satu subproses dibandingkan dengan 2 (atau bahkan 3) yang dibutuhkan oleh sebagian besar solusi lain di sini (biasanya findplus wc).

Menggunakan sh / bash:

cnt = $ ((`stat -c% h folder` - 2))
echo $ cnt # 'echo' adalah builtin sh / bash, bukan proses tambahan

Menggunakan csh / tcsh:

@ cnt = `stat -c% h folder` - 2
echo $ cnt # 'echo' adalah csh / tcsh bawaan, bukan proses tambahan


Penjelasan: stat -c %h foldermencetak jumlah hardlink ke folder , dan setiap subfolder di bawah folder berisi entri ../ yang merupakan hardlink kembali ke folder . Anda harus mengurangi 2 karena ada dua tautan keras tambahan dalam hitungan:

  1. referensi mandiri folder sendiri ./, dan
  2. folder Link 's orangtua untuk folder

Terkait dengan pertanyaan ini: [Mengapa direktori baru memiliki jumlah tautan keras 2 sebelum ada yang ditambahkan ke dalamnya? ] ( unix.stackexchange.com/questions/101515 ) Ini menjelaskan mengapa ini adalah jawaban yang sangat bagus. Sayangnya, ini kurang mendapat perhatian! Meskipun ini adalah jawaban yang bagus, sayangnya hasilnya tergantung pada sistem berkasnya, tetapi untuk kebanyakan sistem berkas umum, ini akan berhasil.
kvantour

8

Saya pikir yang paling mudah adalah

  ls -ld images/* | wc -l

di mana imagesdirektori target Anda. Bendera -d membatasi direktori, dan tanda -l akan menjalankan daftar per baris, kompatibel dengan wc -ljumlah baris yang sangat familiar .


Juga mengembalikan hasil +1
josef

1
Menurut man ls, -dtidak: "daftar direktori sendiri, bukan isinya", yaitu, jika Anda menjalankan ls /tmp, Anda akan mendapatkan apa yang ada di /tmp, dan jika Anda menjalankan ls -d /tmpAnda hanya mendapatkan /tmp. The -dswitch tidak menyaring direktori, seperti yang diminta.
Robert

5

Beberapa contoh berguna:

hitung file di direktori saat ini

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

hitung dirs di dir saat ini

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

hitung file dan direktori di direktori saat ini

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

menghitung file dan direktori dalam satu subdirektori

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

Saya telah memperhatikan hal yang aneh (setidaknya dalam kasus saya):

Ketika saya telah mencoba dengan lsbukan /bin/ls yang -Aparameter do not list implied . and ..TIDAK BEKERJA sebagai espected. Saat saya pake lsshow itu ./ dan ../ Jadi hasilnya salah hitung. SOLUSI: /bin/lssebagai gantinyals


4

Tidak ada direktori yang dapat kami temukan menggunakan perintah di bawah ini

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


Cukup ls -l | grep ^d | wc -llakukan saja, tidak perlu menggunakan di "sini
kaspiotr

3

Solusi pesta murni:

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

Jika Anda juga ingin menghitung direktori tersembunyi:

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

Perhatikan bahwa ini juga akan menghitung tautan ke direktori. Jika Anda tidak menginginkannya, cara ini sedikit lebih sulit.


Menggunakan find:

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

Triknya adalah mengeluarkan xke stdout setiap kali direktori ditemukan, dan kemudian digunakan wcuntuk menghitung jumlah karakter. Ini akan menghitung jumlah semua direktori (termasuk yang tersembunyi), tidak termasuk tautan.


Metode yang disajikan di sini semuanya aman untuk karakter lucu yang dapat muncul di nama file (spasi, baris baru, karakter glob, dll.).


Ini adalah solusi terbaik yang disajikan dalam pertanyaan ini dan akan selalu berhasil!
kvantour

3

Menggunakan zsh:

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

Ini Nadalah nullglob, /membuatnya cocok dengan direktori, #menghitung. Ini akan dengan rapi mengatasi spasi di nama direktori serta mengembalikannya 0jika tidak ada direktori.


0

Hitung semua file dan subfolder, gaya windows:

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

Jika Anda ingin menggunakan ekspresi reguler, cobalah:

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

1
Apakah Anda ingin menambahkan penjelasan untuk jawaban hanya kode Anda? Ini akan membantu melawan kesalahpahaman bahwa StackOverflow adalah layanan penulisan kode gratis. Juga, lihat di sini untuk meningkatkan penampilan: stackoverflow.com/editing-help
Yunnosch

0

Jawaban terbaik untuk apa yang Anda inginkan adalah

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

ini mengurangi satu untuk menghapus '.' yang tidak diinginkan direktori yang menemukan daftar (seperti patel deven yang disebutkan di atas).

Jika Anda ingin menghitung subfolder secara rekursif, biarkan saja opsi maxdepth, jadi

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

PS Jika Anda menemukan substitusi perintah jelek, menguranginya dapat dilakukan sebagai aliran murni menggunakan seddan bc.

Mengurangi satu dari hitungan:

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

atau, menambahkan hitungan ke minus satu:

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

-1

Cara terbaik untuk melakukannya:

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

Ini memberi Anda hitungan yang sempurna.


6
Maksudmu itu cara yang lebih buruk untuk melakukannya! Selain itu, ini tidak menghitung jumlah direktori. Dan bagaimana jika ada nama direktori yang berisi string tersebut total? metode Anda rusak :(. Jangan parsels !
gniourf_gniourf
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.