在 Ubuntu 中的 bash 下,我想要ls -lah
一个目录并让它递归地显示目录的文件计数。这就是说我希望它计算目录及其子目录中的所有文件。
这可能吗?
答案1
我忽略了使用ls
此处的请求,因为在大多数 Unix 上,该实用程序的输出通常只适合查看。
下面将使用find
withbash
递归地计算当前目录的每个子目录中的名称数量。
find . -type d -exec bash -O nullglob -O dotglob -c '
for dirpath do
set -- "$dirpath"/*
printf "%s:\t%d\n" "$dirpath" "$#"
done' bash {} +
它bash
使用一批目录路径名进行调用,内联脚本会迭代给定的批次并扩展*
每个批次中的通配模式。设置nullglob
和dotglob
shell 选项后,这将扩展为一个(可能是隐藏的)名称列表,并且$#
是该列表的长度。
如果您只想要当前工作目录中最顶层目录的计数:
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
请注意,我只将一个地方*
从一个地方移动到另一个地方。