如何使用 ls 命令递归显示目录文件计数?

如何使用 ls 命令递归显示目录文件计数?

在 Ubuntu 中的 bash 下,我想要ls -lah一个目录并让它递归地显示目录的文件计数。这就是说我希望它计算目录及其子目录中的所有文件。

这可能吗?

答案1

我忽略了使用ls此处的请求,因为在大多数 Unix 上,该实用程序的输出通常只适合查看。

下面将使用findwithbash递归地计算当前目录的每个子目录中的名称数量。

find . -type d -exec bash -O nullglob -O dotglob -c '
    for dirpath do
        set -- "$dirpath"/*
        printf "%s:\t%d\n" "$dirpath" "$#"
    done' bash {} +

bash使用一批目录路径名进行调用,内联脚本会迭代给定的批次并扩展*每个批次中的通配模式。设置nullglobdotglobshell 选项后,这将扩展为一个(可能是隐藏的)名称列表,并且$#是该列表的长度。

如果您只想要当前工作目录中最顶层目录的计数:

shopt -s globstar nullglob dotglob
for dirpath in */; do
    set -- "$dirpath"/**
    printf '%s:\t%d\n' "$dirpath" "$#"
done

这几乎是一样的,只是我们不再需要使用find.我们使用**递归方式遍历每个目录下的所有名称,然后像以前一样显示结果。

事实上,我们可以稍微修改一下,以重新创建第一段代码,而find根本不需要。递归获取每个目录中的名称计数:

shopt -s globstar nullglob dotglob
for dirpath in **/; do
    set -- "$dirpath"/*
    printf '%s:\t%d\n' "$dirpath" "$#"
done

请注意,我只将一个地方*从一个地方移动到另一个地方。

相关内容