访问第n个子目录深度和文件数

访问第n个子目录深度和文件数

使用 cd 命令和 ls 可以将 UNIX 机器的树设置为从根“/”开始的 2 个子目录深度。如果文件或目录的数量大于20,则仅指定文件或子目录的数量。

到目前为止我尝试过:

cd /../.. | ls -l | wc -l

但我真的不知道这是否能满足我的需要。我知道厕所。会计算文件数量,但我没有得到。 cd/../../因为看起来我往下走两层。嗯,看起来很混乱。

答案1

你的命令毫无意义。首先,cd /../..与 相同cd /,即它只是将当前工作目录更改为目录层次结构中的最顶层目录。第二,cd不产生任何输出,因此将其通过管道传输到任何事物不会有什么好处。

第三,ls -l将生成当前目录中的条目(名称)列表。您正在使用wc -l来计算数量线在 的输出中ls -l。这个数字可能比任何目录中目录条目的实际数量至少多一个,因为ls -l输出一种标头(BSDls不会这样做)空的目录,但 GNUls总是这样做)。 ls -l将要不是列出隐藏文件名,并且它将(当通过管道传递到 时wc -l)产生多行对于文件名中嵌入换行符的文件。

ls除了(用眼睛)查看目录列表外,请勿用于任何其他用途,并且仅用于wc -l计数线。有更智能、更快捷的文件计数方法。

有关的:


要使用 列出所有二级子目录中的目录条目(名称)数量bash,请使用类似

shopt -s nullglob dotglob

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

这会循环遍历所有二级目录。对于每个目录,它都会扩展*目录中的通配模式并将位置参数设置为结果名称。执行此操作后,特殊变量$#将包含位置参数(目录中的名称)的数量。然后我们打印目录路径名以及该计数。

nullglob首先设置和shell选项dotglob,以便我们正确计算隐藏名称,并获得空目录的正确计数 (0)。

您是否想要对第 2 层的每个子目录进行递归计数:

shopt -s nullglob dotglob globstar

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

globstar中的 shell 选项允许bash使用**,这是一种“递归”匹配子目录的模式。

您是否只想列出其中包含 20 个或更多条目的条目(这里使用上面的第二种变体,它在每个子目录中递归地计算名称):

shopt -s nullglob dotglob globstar

for dirpath in /*/*/; do
    set -- "$dirpath"/**/*
    if [[ $# -ge 20 ]]; then
        printf '%d\t%s\n' "$#" "$dirpath"
    fi
done

相关内容