Unix - 仅列出包含子目录的目录

时间:2015-11-10 21:45:15

标签: linux shell unix command

如何在Unix shell中打印树中包含其他目录的目录数?

我还没有使用findls等命令找到解决方案。

2 个答案:

答案 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创建临时文件名:

{{2}}

它处理最常见的信号(HUP,INT,QUIT,PIPE,TERM)并删除临时文件,即使其中一个到达。

显然,如果您只想计算目录数,可以通过!define MUI_UI yourfile.exe管道上述命令的输出来计算。