计算特定目录中的目录数
1. 概述
在本教程中,我们将学习如何计算特定目录中的目录数。虽然问题看起来很简单,但有几点需要牢记。我们将探索各种技术来解决这个问题。
2. 样本目录
让我们看看我们将使用的sample目录中的目录、子目录和文件的列表。我们可以在tree 命令的帮助下做到这一点:
$ tree sample
sample
├── test1
│ └── test5
├── test2
├── test3
├── test4
└── test_file1.docx
5 directories, 1 file
我们的sample目录包含四个目录:test1、test2、test3、test4 ,一个文件:test_file1.docx,以及test1目录的一个子目录:test5。因此,sample目录中共有五个目录:test1、test2、test3、test4和test5。
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 1的find*命令将目录中的递归总数设置为 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 1的tree命令将目录的显示级别设置为 1。
在我们的sample目录中,test5目录(位于级别2的子目录test1中)不计入目录计数。
默认情况下,并不是每个 Linux 系统都安装tree命令,但是如果我们的系统上不存在它,我们可以使用yum 或 apt-get 轻松安装它。