Contents

如何计算Linux中的文件数

1. 概述

有时,我们可能需要统计 Linux 系统中每个目录中的文件数量。没有一个命令可以解决这个问题。但是,我们可以通过组合一些在大多数 Linux 发行版上默认可用的基本命令来找到解决方案。

在本教程中,我们将探索一些解决方案来计算每个目录中的文件数。

2. 问题

对于这个例子,让我们看一个包含三个子目录的目录:

$ ls
Assignments Conference Projects

每个子目录都包含文件和其他目录,其中包含文件:

$ ls *
Assignments:
1.txt  2.txt  3.txt  directory_1  directory_2
Conference:
1.txt  2.txt directory_3
Projects:
1.txt  2.txt  3.txt  directory_4  directory_5

我们可以看到,Assignments目录中有 5 个文件, Conference目录中有 3 个文件,Projects目录中有 5 个文件。

让我们也显示其他子目录的内容。

Assignments/directory_1Assignments/directory_2中,我们有这些文件:

$ ls Assignments/ *
directory_1:
1.txt    2.txt    3.txt    4.txt
directory_2:
1.txt    2.txt    3.txt

Conference/directory_3中,我们有这些文件:

$ ls Conference/ *
directory_3:
1.txt    2.txt    3.txt

最后,在Projects/directory_4Projects/directory_5中,我们有这些文件:

$ ls Projects/ *
directory_4:
1.txt    2.txt    3.txt
directory_5:
1.txt    2.txt    3.txt    4.txt

综上所述,我们应该期望我们的整体输出看起来像这样:

5 Assignments
  4 in ./Assignments/directory_1
  3 in ./Assignments/directory_2
3 Conference
  1 in ./Conference/directory_3
5 Projects
  3 in ./Projects/directory_4
  4 in ./Projects/directory_5

考虑到这一点,让我们探索完成此操作所需的命令。

3. 使用find

**Linux *find *命令是一种灵活而强大的工具,可以在目录层次结构中搜索文件和目录。**它可以搜索可执行文件、空文件、其他用户拥有的文件,甚至具有特定扩展名的文件。

** find命令默认是递归的,可以使用正则表达式模式列出文件和目录以及它们各自的访问或修改日期。**

首先,让我们看看如何使用find命令列出当前工作目录中的所有目录和子目录:

$ find . -type d -print0
../Assignments./Assignments/directory_1./Assignments/directory_2./Conference./Conference/directory_3./Projects./Projects/directory_4./Projects/directory_5

在这里,我们使用“ . ” 符号指向当前工作目录。然后我们使用*-type d选项搜索所有目录并打印它们的相对路径。我们使用-print0*选项在一行中输出结果。

接下来,我们将输出通过管道传送到while循环,以计算每个目录中的文件数:

$ find . -type d -print0 | while read -d "" -r dir; do
    files=("$dir"/*)
    printf "%5d files in directory %s\n" "${#files[@]}" "$dir"
done

在运行这个命令时,我们得到这个输出:

    3 files in directory .
    5 files in directory ./Assignments
    4 files in directory ./Assignments/directory_1
    3 files in directory ./Assignments/directory_2
    3 files in directory ./Conference
    1 files in directory ./Conference/directory_3
    5 files in directory ./Projects
    3 files in directory ./Projects/directory_4
    4 files in directory ./Projects/directory_5

find命令的输出通过管道传送到包含read命令的while循环,该命令使用分隔符 ( -d ) 选项拆分目录名称。

*然后我们使用-r*选项按原样处理反斜杠字符。反斜杠字符通常用作转义字符 。**这很重要,因为每个目录名称都包含一个反斜杠。

最后,我们创建一个名为dir的变量来跟踪每个目录名称,然后统计每个目录中的文件数。

此方法计算每个目录和子目录中的所有文件,无论它们位于指定目录层次结构中的哪个级别。

4. 使用awk

awk 命令是一个功能强大的Linux 工具,通常用于处理文本文件并根据该数据生成报告。

让我们使用awk来查找每个目录和子目录中的文件总数。但是,我们需要使用find、  grepwc 命令对其进行管道传输,以准确计算文件数

$ find . -type d | awk '{print "echo -n \""$0" \";ls -l "$0" | grep -v total | wc -l" }' | sh

在运行这个命令时,我们得到这个输出:

. 3
./Assignments 5
./Assignments/directory_1 4
./Assignments/directory_2 3
./Conference 3
./Conference/directory_3 1
./Projects 5
./Projects/directory_4 3
./Projects/directory_5 4

find命令返回我们当前工作目录中所有目录和子目录的列表。我们将输出传递给awk命令,在该命令中我们列出并打印所有文件和目录名称,每个名称由换行符分隔。

最后,我们将输出传递给grep -v total命令,该命令反转匹配,wc命令计算行数。计数的行数表示该目录中的文件数。

此方法还扫描所有目录和子目录中的文件,无论它们位于指定目录层次结构中的哪个级别。由于这种方法通过三个不同的命令传递输出,因此它可能比第一种方法慢。