đếm số lượng thư mục trong một thư mục cụ thể


103

Cách đếm số lượng thư mục trong một thư mục cụ thể. Tôi đang sử dụng lệnh sau, nhưng nó luôn cung cấp một lệnh bổ sung.

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

Ví dụ, nếu tôi có 3 thư mục, lệnh này cung cấp 4. Nếu nó chứa 5 thư mục, lệnh cung cấp 6. Tại sao vậy?


4
Số lượng 1 bổ sung ở đó do thư mục hiện tại '.' , cũng được tính đến bởi 'find'.
patel deven 17/02/17

Câu trả lời:


94

find cũng đang in chính thư mục:

$ 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

Thay vào đó, bạn có thể kiểm tra các phần tử con của thư mục và hoàn toàn không truy cập vào chúng:

$ 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

Bạn cũng có thể sử dụng 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

Đẹp! Bạn sẽ làm điều này như thế nào $ ls -l .vimvới PHP? Hoặc làm thế nào để chỉ lấy tổng số, không có danh sách. Ý tôi là, trong trường hợp này chỉ nhận được 52?
Pathros

Hả. Tôi thích cách lập luận chống lại PowerShell là BASH dễ dàng hơn về mọi mặt ... bạn muốn xem lệnh POSH để thực hiện điều này? (ls).Count
Kolob Canyon

@Pathros Sử dụng hình cầu với cờ GLOB_ONLYDIR và đếm () kết quả.
Pilipe

1
ls -l | grep -c ^dlà chết đơn giản và hoạt động. @Pathros có lẽ là một cách tốt hơn trong PHP, nhưng trường hợp xấu nhất trong PHP, bạn luôn có thể sử dụng hàm shell_exec () để thực thi dòng lệnh và trả về kết quả thành một chuỗi. tức là $dirCount = shell_exec('ls -l | grep -c ^d');
gigabyte

66

Chỉ đếm các thư mục trong thư mục hiện tại

echo */ | wc

bạn sẽ ra ngoài giống như 1 309 4594

2nd digitđại diện cho không. của các thư mục.

hoặc là

tree -L 1 | tail -1


8
Điều này không thành công nếu không may có khoảng trắng trong tên dir.
Michael Campbell

zsh: no matches found: */cần nullglob
Anne van Rossum

@AnnevanRossum Bạn có echo. typewhich echo
EmptyData

7
Cái đầu tiên có thể được cải thiện thêm một chút:echo */ | wc -w
ibic

Nota rằng điều này sẽ đếm 1 nếu không có thư mục thay vì 0.
jinawee

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

Đối với tìm -mindepthcó nghĩa là tổng số lặp lại trong thư mục

-maxdepth có nghĩa là tổng số lặp lại trong thư mục

-type d nghĩa là thư mục

Và for wc -lcó nghĩa là đếm các dòng của đầu vào


2
Bạn có thể giải thích câu trả lời của bạn (bên trong câu trả lời của bạn)?
Zulu

phương tiện -mindepth tổng số recusive trong các thư mục, phương tiện -maxdepth tổng số recusive trong danh bạ, thư mục -type d phương tiện, và wc -l phương tiện đếm dòng từ thư mục nhất định niêm yết
suresh shiyani

find . -mindepth 1 -maxdepth 1 -type d | wc -lsẽ cung cấp cho bạn nhiều khoảng cách giữa số, ví dụ: `` 2 'bạn có thể ngăn chặn nó bằng cách sử dụng điều này: dir_count=`find . -maxdepth 1 -type d | wc -l | xargs`; echo $dir_count # will print just 2 và có thể hữu ích cho các điều kiện, như:if (( $dir_count > 1 )); then echo "Yaa"; fi # will print "Yaa"
naorz

16

Nếu bạn chỉ có các thư mục trong thư mục và không có tệp nào thì điều này sẽ xảy ra:

ls | wc -l

2
Điều này cũng nhận được các tệp, nhưng câu hỏi là về các thư mục / thư mục.
Robert

12

Cách tốt nhất để điều hướng đến ổ đĩa của bạn và chỉ cần thực hiện

ls -lR | grep ^d | wc -l

và để Tìm tổng cộng tất cả các thư mục, bao gồm cả các thư mục con?

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

... hay tìm tất cả các thư mục trong thư mục gốc (không bao gồm thư mục con)?

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

Chúc mừng!


Lưu ý rằng các lệnh trước đó -lRbỏ qua thư mục có tiền tố dấu chấm trong khi find -type d đếm chúng. Vì vậy, số lượng được cung cấp bởi lệnh đầu tiên là sai nếu bạn có các thư mục có tiền tố dấu chấm (ví dụ bạn có thư mục con .git!). Bạn không thể đơn giản sử dụng -lRavì bạn cũng nhận được cho mỗi thư mục a ...mục nhập. Nó cũng áp dụng cho câu trả lời của @Pavel Anossov
marcz 10/09/15

12

Chạy stat -c %h foldervà trừ 2 từ kết quả. Điều này chỉ sử dụng một quy trình con duy nhất trái ngược với 2 (hoặc thậm chí 3) được yêu cầu bởi hầu hết các giải pháp khác ở đây (thường là findcộng wc).

Sử dụng sh / bash:

cnt = $ ((thư mục `stat -c% h` - 2))
echo $ cnt # 'echo' là một nội trang sh / bash, không phải là một quá trình bổ sung

Sử dụng csh / tcsh:

@ cnt = `stat -c% h folder` - 2
echo $ cnt # 'echo' là một nội trang csh / tcsh, không phải là một quy trình bổ sung


Giải thích: stat -c %h folderin số lượng liên kết cứng đến thư mục và mỗi thư mục con trong thư mục chứa mục nhập ../ là liên kết cứng quay lại thư mục . Bạn phải trừ đi 2 vì có hai liên kết cứng bổ sung trong số:

  1. mục nhập ./ tự tham chiếu của chính thư mục
  2. thư mục liên kết 's cha mẹ đến thư mục

Liên quan đến câu hỏi này: [Tại sao một thư mục mới có tổng số liên kết cứng là 2 trước khi bất kỳ thứ gì được thêm vào nó? ] ( unix.stackexchange.com/questions/101515 ) Nó giải thích tại sao đây là một câu trả lời tuyệt vời. Thật không may, điều này đã không nhận được đủ sự quan tâm! Mặc dù đây là một câu trả lời hay, nhưng kết quả của nó không may phụ thuộc vào hệ thống tệp, nhưng đối với hầu hết các hệ thống tệp phổ biến, điều này sẽ hoạt động.
kvantour

8

Tôi nghĩ đơn giản nhất là

  ls -ld images/* | wc -l

imagesthư mục mục tiêu của bạn ở đâu . Cờ -d giới hạn cho các thư mục và cờ -l sẽ thực hiện liệt kê trên mỗi dòng, tương thích với wc -lphép đếm dòng rất quen thuộc .


Cũng trả về kết quả 1
Josef

1
Theo man ls, -ddoes: "tự liệt kê các thư mục, không phải nội dung của chúng", nghĩa là, nếu bạn chạy ls /tmp, bạn sẽ nhận được những gì có trong /tmpvà nếu bạn chạy ls -d /tmpbạn chỉ nhận được /tmp. Công -dtắc không lọc các thư mục, như đã được yêu cầu.
Robert

5

Một số ví dụ hữu ích:

đếm các tệp trong dir hiện tại

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

đếm dir bằng dir hiện tại

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

đếm tệp và dirs trong dir hiện tại

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

đếm tệp và ký tự trong một thư mục con

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

Tôi đã nhận thấy một điều kỳ lạ (ít nhất là trong trường hợp của tôi):

Khi tôi đã thử với lsthay vì /bin/ls các -Atham số do not list implied . and ..không làm việc như espected. Khi tôi sử dụng lschương trình đó ./ và ../ Vì vậy, kết quả đó đếm sai. GIẢI PHÁP: /bin/lsthay vào đóls


4

Không có thư mục nào mà chúng ta có thể tìm thấy bằng lệnh dưới đây

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


Chỉ cần ls -l | grep ^d | wc -lsẽ làm, không cần phải sử dụng "ở đây
kaspiotr

3

Một giải pháp bash tinh khiết:

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

Nếu bạn cũng muốn đếm các thư mục ẩn:

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

Lưu ý rằng điều này cũng sẽ tính các liên kết đến các thư mục. Nếu bạn không muốn điều đó, thì sẽ khó hơn một chút với phương pháp này.


Sử dụng find:

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

Bí quyết là xuất một xto stdout mỗi khi tìm thấy một thư mục, sau đó sử dụng wcđể đếm số ký tự. Điều này sẽ đếm số lượng tất cả các thư mục (bao gồm cả những thư mục ẩn), không bao gồm các liên kết.


Các phương pháp được trình bày ở đây là tất cả các ký tự vui nhộn an toàn có thể xuất hiện trong tên tệp (dấu cách, dòng mới, ký tự hình cầu, v.v.).


Đây là giải pháp tốt nhất được trình bày trong câu hỏi này và sẽ luôn hoạt động!
kvantour

3

Sử dụng zsh:

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

Đây Nlà một nullglob, /làm cho nó khớp với các thư mục, #số lượng. Nó sẽ xử lý gọn gàng các khoảng trống trong tên thư mục cũng như trả về 0nếu không có thư mục.


0

Đếm tất cả các tệp và thư mục con, kiểu cửa sổ:

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

Nếu bạn muốn sử dụng cụm từ thông dụng, hãy thử:

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

1
Bạn có muốn thêm một số giải thích cho câu trả lời chỉ có mã của mình không? Nó sẽ giúp chống lại quan niệm sai lầm rằng StackOverflow là một dịch vụ viết mã miễn phí. Ngoài ra, hãy xem tại đây để cải thiện ngoại hình: stackoverflow.com/editing-help
Yunnosch

0

Câu trả lời tốt nhất cho những gì bạn muốn là

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

cái này trừ một cái để loại bỏ '.' thư mục tìm danh sách (như patel deven đã đề cập ở trên).

Nếu bạn muốn đếm đệ quy các thư mục con, thì chỉ cần bỏ tùy chọn maxdepth, vì vậy

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

Tái bút Nếu bạn thấy việc thay thế lệnh xấu, việc trừ một lệnh có thể được thực hiện như một luồng thuần túy bằng cách sử dụng sedbc.

Trừ một số khỏi số đếm:

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

hoặc, thêm số vào trừ một:

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

-1

Cách tốt nhất để làm điều đó:

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

Điều này mang lại cho bạn số lượng hoàn hảo.


6
Bạn có nghĩa là đó là cách tồi tệ hơn để làm điều đó! ngoài ra, điều này không tính số lượng thư mục. Và điều gì sẽ xảy ra nếu có một tên thư mục chứa chuỗi total? phương pháp của bạn bị hỏng:( . Đừng phân tích cú phápls !
gniourf_gniourf
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.