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?

pengguna2566898
sumber
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
Pavel Anossov
sumber
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

EmptyData
sumber
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

shiyani suresh
sumber
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
Brainmaniac
sumber
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!

Manish Shrivastava
sumber
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
textral
sumber
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 .

briceburg.dll
sumber
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

MTK
sumber
4

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

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

pengguna1388547
sumber
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.).

gniourf_gniourf
sumber
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.

Anne van Rossum
sumber
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"
margenn
sumber
0

Jika Anda ingin menggunakan ekspresi reguler, cobalah:

ls -c | grep "^d" | wc -l
makassi
sumber
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
Dr. Orang Orang II
sumber
-1

Cara terbaik untuk melakukannya:

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

Ini memberi Anda hitungan yang sempurna.

Manoj
sumber
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