Linux 计算特定目录中的目录数

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/17648033/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-07 00:15:42  来源:igfitidea点击:

counting number of directories in a specific directory

linuxbash

提问by user2566898

How to count the number of folders in a specific directory. I am using the following command, but it always provides an extra one.

如何计算特定目录中的文件夹数量。我正在使用以下命令,但它总是提供一个额外的命令。

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

For example, if I have 3 folders, this command provides 4. If it contains 5 folders, the command provides 6. Why is that?

例如,如果我有 3 个文件夹,此命令提供 4 个。如果它包含 5 个文件夹,则该命令提供 6 个。为什么会这样?

回答by Pavel Anossov

findis also printing the directory itself:

find也在打印目录本身:

$ 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

You can instead test the directory's children and do not descend into them at all:

您可以改为测试目录的子项,并且根本不进入它们:

$ 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

You can also use ls:

您还可以使用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

回答by EmptyData

Get a count of only the directories in the current directory

仅获取当前目录中的目录数

echo */ | wc

echo */ | wc

you will get out put like 1 309 4594

你会像 1 309 4594

2nd digitrepresents no. of directories.

2nd digit代表没有。的目录。

or

或者

tree -L 1 | tail -1

tree -L 1 | tail -1

回答by Manish Shrivastava

Best way to navigate to your drive and simply execute

导航到您的驱动器并简单地执行的最佳方式

ls -lR | grep ^d | wc -l

and to Find all folders in total, including subdirectories?

并找到所有文件夹,包括子目录?

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

...or find all folders in the root directory (not including subdirectories)?

...或找到根目录中的所有文件夹(不包括子目录)?

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

Cheers!

干杯!

回答by shiyani suresh

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

For find -mindepthmeans total number recusive in directories

对于 find-mindepth表示目录中递归的总数

-maxdepthmeans total number recusive in directories

-maxdepth表示目录中递归的总数

-type dmeans directory

-type d表示目录

And for wc -lmeans count the lines of the input

而对于wc -l意味着计算输入的行数

回答by gniourf_gniourf

A pure bash solution:

一个纯粹的 bash 解决方案:

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

If you also want to count the hidden directories:

如果您还想计算隐藏目录:

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

Note that this will also count links to directories. If you don't want that, it's a bit more difficult with this method.

请注意,这也将计算到目录的链接。如果你不想那样,用这种方法会有点困难。



Using find:

使用find

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

The trick is to output an xto stdout each time a directory is found, and then use wcto count the number of characters. This will count the number of all directories (including hidden ones), excluding links.

诀窍是x每次找到目录时输出一个到标准输出,然后用于wc计算字符数。这将计算所有目录(包括隐藏目录)的数量,不包括链接。



The methods presented here are all safe wrt to funny characters that can appear in file names (spaces, newlines, glob characters, etc.).

此处介绍的方法对于可能出现在文件名中的有趣字符(空格、换行符、glob 字符等)都是安全的。

回答by textral

Run stat -c %h folderand subtract 2 from the result. This employs only a single subprocess as opposed to the 2 (or even 3) required by most of the other solutions here (typically findplus wc).

运行stat -c %h folder并从结果中减去 2。这仅使用一个子流程,而不是此处大多数其他解决方案所需的 2 个(甚至 3 个)(通常为findplus wc)。

Using sh/bash:

使用 sh/bash:

cnt=$((`stat -c %h folder` - 2))
echo $cnt   # 'echo' is a sh/bash builtin, not an additional process

cnt=$((`stat -c %h folder` - 2))
echo $cnt # 'echo' 是一个 sh/bash 内置程序,而不是一个额外的进程

Using csh/tcsh:

使用 csh/tcsh:

@ cnt = `stat -c %h folder` - 2
echo $cnt   # 'echo' is a csh/tcsh builtin, not an additional process

@ cnt = `stat -c %h folder` - 2
echo $cnt # 'echo' 是一个 csh/tcsh 内建的,不是一个额外的进程


Explanation: stat -c %h folderprints the number of hardlinks to folder, and each subfolder under foldercontains a ../ entry which is a hardlink back to folder. You must subtract 2 because there are two additional hardlinks in the count:


说明:stat -c %h folder打印到文件夹的硬链接数,文件夹下的每个子文件夹都包含一个 ../ 条目,它是返回文件夹的硬链接。您必须减去 2,因为计数中有两个额外的硬链接:

  1. folder's own self-referential ./ entry, and
  2. folder's parent's link to folder
  1. 文件夹自己的自引用 ./ 条目,以及
  2. folder的父文件夹的链接

回答by briceburg

I think the easiest is

我认为最简单的是

  ls -ld images/* | wc -l

where imagesis your target directory. The -d flag limits to directories, and the -l flag will perform a per-line listing, compatible with the very familiar wc -lfor line count.

images你的目标目录在哪里。-d 标志限制目录,-l 标志将执行每行列表,与非常熟悉wc -l的行数兼容。

回答by Manoj

Best way to do it:

最好的方法:

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

This gives you the perfect count.

这为您提供了完美的计数。

回答by Anne van Rossum

Using zsh:

使用zsh

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

The Nis a nullglob, /makes it match directories, #counts. It will neatly cope with spaces in directory names as well as returning 0if there are no directories.

N是一个 nullglob,/使它匹配目录,#计数。它将巧妙地处理目录名称中的空格,0并在没有目录时返回。

回答by margenn

Count all files and subfolders, windows style:

统计所有文件和子文件夹,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"