使用 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