如何在Unix shell中打印树中包含其他目录的目录数?
我还没有使用find
或ls
等命令找到解决方案。
答案 0 :(得分:2)
您可以使用find
命令:find . -type d -not -empty
这将打印每个非空的子目录。您可以使用-maxdepth
控制搜索的深度。
要打印该号码,您可以使用wc -l
。
find . -type d -not -empty | wc -l
答案 1 :(得分:1)
如果生成特定目录下所有目录的列表,然后从名称中删除最后一个组件,则会有一个包含子目录的目录列表,但该列表中可能会有重复。所以,你需要对列表进行后期处理,产生(作为第一个近似值):
find
查找变量{
printf '\\#^%s$#d\n' ${base:-.}
echo 's%/[^/]*$%%'
} > sed.script
find ${base:-.} -type d |
sed -f sed.script |
sort -u
rm -f sed.script
中列出的目录下的所有目录,默认为当前目录,并打印其名称。该代码假定您没有名称中带有换行符的目录。如果你这样做,有一些修复,但最好的解决方法是重命名目录。 \\#^%s$#d
命令删除最后一个斜杠及其后的所有内容。排序消除了重复的条目。剩下的是包含子目录的目录列表。
嗯,或多或少。有一个需要考虑的退化情况:列表中的顶级目录将被列出,无论它们是否有子目录。修复这个问题有点困难。在删除尾随材料之前,您需要消除与#
指定的目录完全匹配的任何输出行。所以,你需要这样的东西:
#
sed.script
假设您不在目录名中使用mktemp
。如果您确实使用它,那么您需要找到一个不在名称中使用的字符(可能是Control-A),并使用它来代替tmp=$(mktemp ${TMPDIR:-/tmp}/dircnt.XXXXXX)
trap "rm -f $tmp; exit 1" 0 1 2 3 13 15
{
printf '\\#^%s$#d\n' ${base:-.}
echo 's%/[^/]*$%%'
} > $tmp
find ${base:-.} -type d |
sed -f $tmp |
sort -u
rm -f $tmp
trap 0
。如果你可以完全面对任何角色,那么当它出现在目录名中时,你需要做更多的工作来逃避一些模糊的角色,比如Control-A。
仍然存在一个问题:使用wc -l
这样的固定名称作为临时文件名是不好的(出于多种原因 - 例如两个人试图在同一目录中同时运行脚本,尽管它也可能是安全风险),因此请使用ChangeUI
创建临时文件名:
它处理最常见的信号(HUP,INT,QUIT,PIPE,TERM)并删除临时文件,即使其中一个到达。
显然,如果您只想计算目录数,可以通过!define MUI_UI yourfile.exe
管道上述命令的输出来计算。