Contents

计算特定目录中的目录数

1. 概述

在本教程中,我们将学习如何计算特定目录中的目录数。虽然问题看起来很简单,但有几点需要牢记。我们将探索各种技术来解决这个问题。

2. 样本目录

让我们看看我们将使用的sample目录中的目录、子目录和文件的列表。我们可以在tree 命令的帮助下做到这一点:

$ tree sample
sample
├── test1
│   └── test5
├── test2
├── test3
├── test4
└── test_file1.docx
5 directories, 1 file

我们的sample目录包含四个目录:test1test2test3test4 ,一个文件:test_file1.docx,以及test1目录的一个子目录:test5。因此,sample目录中共有五个目录:test1test2test3test4test5

3. 统计目录数量

现在让我们讨论一些常见的解决方案,以解决在目录中计算目录数量的问题。

3.1. 使用find命令

find 命令在文件系统上查找目录和文件并对其执行操作。

让我们看看如何使用find命令(递归搜索)获取目录中目录的数量:

$ find . -type d | wc -l
   6

上面的find命令在当前目录中查找目录。这里,点*(“.”)指的是当前目录,* -type d表示我们只对查找目录**而不是常规文件感兴趣。

wc 命令表示字数。在上面的示例中,find命令将其输出重定向到wc -l命令的标准输入,该命令对该输入执行行计数。

现在,如上所述,我们的sample目录包含 五个目录。但是,**上述命令的输出显示目录计数为6 **。为什么有区别?简单地说,它计算了六个目录,因为find . -type d命令还输出当前目录

$ find . -type d
.
./test1
./test1/test5
./test4
./test3
./test2

我们可以使用-mindepth 1 选项运行find*命令以从输出中排除当前目录*:

$ find . -mindepth 1 -type d | wc -l
    5

通过使用*–mindepth 1选项,它会找到除当前目录之外的所有目录,从而产生我们想要的结果5*。

现在,假设我们只想直接计算示例目录中的目录数量,而不考虑任何嵌套的子目录——非递归搜索。我们如何使用find命令来实现这一点?

其实实现起来很简单:

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

上述命令的输出显示目录计数为4而不是5。为什么有区别?带有选项*-maxdepth 1find*命令将目录中的递归总数设置为 1。

这意味着只考虑当前目录的直接子目录。在我们的示例示例目录中,目录计数中不考虑test5目录(位于子目录test1中)。

3.2. 使用ls命令

*ls *命令列出目录中包含的目录和文件。

让我们探索如何使用ls命令获取当前目录中的目录总数。首先,我们将进行递归搜索,其中包括嵌套的子目录

$ ls -lR | grep ^d | wc -l
  5

带有*-lR选项的ls*命令以递归方式显示当前目录中子目录的列表(以长格式)。

然后,我们使用grep 命令在输入中搜索字符串或模式。在上面的命令中,ls命令列出了所有目录的内容。在这里,我们将第一个命令 ( ls -lR ) 的输出通过管道 ( “|” ) 传递到第二个命令 ( grep ^d ) 的输入。同样,我们将第二个命令 ( grep ^d ) 的输出通过管道 ( “|” ) 传递到第三个命令 ( wc -l ) 的输入。

grep命令匹配输入中每一行开头的模式*“d”* 。插入符号*(“^”)*指的是行首。

再次,wc -l计算行数。

如果我们想获得不包括嵌套子目录的目录总数(非递归搜索),我们只需要从上面使用的ls命令中删除-R*标志*:

$ ls -l | grep ^d | wc -l
   4

3.3. 使用tree 命令

tree命令是一个 Linux 程序,用于以树状结构列出目录和文件。

让我们探索如何使用tree命令(递归搜索)获取目录中的目录总数

$ tree | tail -1
5 directories, 1 file

tree命令递归地显示当前目录树的深度。 *tail *命令将输入文件的最后十行写入标准输出。在上面的示例中,tree命令列出了当前目录中的所有目录。在这里,我们将第一个命令 ( tree ) 的输出通过管道 ( “|” ) 传递到第二个命令 ( tail -1 ) 的输入。

带有*-1选项的tail*命令打印该输入的最后一行:

$ tree
.
├── test1
│   └── test5
├── test2
├── test3
├── test4
└── test_file1.docx
5 directories, 1 file

现在,让我们使用tree命令执行非递归搜索

$ tree -L 1|tail -1
4 directories, 1 file

上述命令的输出显示目录计数为四个而不是五个。为什么有区别?带有选项-L 1tree命令将目录的显示级别设置为 1。

在我们的sample目录中,test5目录(位于级别2的子目录test1中)不计入目录计数。

默认情况下,并不是每个 Linux 系统都安装tree命令,但是如果我们的系统上不存在它,我们可以使用yum 或 apt-get 轻松安装它。