Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Unix-仅列出包含子目录的目录_Linux_Shell_Unix_Command - Fatal编程技术网

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

Linux Unix-仅列出包含子目录的目录,linux,shell,unix,command,Linux,Shell,Unix,Command,如何在Unix shell中打印树中包含其他目录的目录数 我还没有找到像find或ls这样的命令的解决方案 您可以使用find命令:find-类型d-非空 它将打印每个非空的子目录。您可以使用-maxdepth控制搜索深度 要打印号码,可以使用wc-l find . -type d -not -empty | wc -l 如果生成一个特定目录下所有目录的列表,然后从名称中删除最后一个组件,则会有一个包含子目录的目录列表,但该列表中可能会有重复。因此,您需要对列表进行后处理,从而产生(作为第一近

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


我还没有找到像
find
ls
这样的命令的解决方案

您可以使用
find
命令:
find-类型d-非空

它将打印每个非空的子目录。您可以使用
-maxdepth
控制搜索深度

要打印号码,可以使用
wc-l

find . -type d -not -empty | wc -l

如果生成一个特定目录下所有目录的列表,然后从名称中删除最后一个组件,则会有一个包含子目录的目录列表,但该列表中可能会有重复。因此,您需要对列表进行后处理,从而产生(作为第一近似值):

查找变量
$base
中列出的目录下的所有目录,默认为当前目录,并打印它们的名称。代码假定您没有名称中带有换行符的目录。如果您这样做,则会有修复,但最好的修复方法是重命名目录。
sed
命令删除最后一个斜杠及其后面的所有内容。该排序消除了重复条目。剩下的是包含子目录的目录列表

嗯,或多或少。有一种退化情况需要考虑:列表中的顶级目录将被列出,而不管它们是否有子目录。解决这个问题有点困难。在删除尾随资料之前,您需要删除与指定给
find
的目录完全匹配的任何输出行。所以,你需要像这样的东西:

{
printf '\\#^%s$#d\n' ${base:-.}
echo 's%/[^/]*$%%'
} > sed.script
find ${base:-.} -type d |
sed -f sed.script |
sort -u
rm -f sed.script
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/code>假定您不在目录名中使用
\\\\\\\\/code>。如果您确实使用了它,那么您需要找到一个在名称(可能是Control-a)中不使用的字符,并使用它来代替
。如果您可以完全面对任何字符,那么您需要做更多的工作来转义一些模糊的字符,例如Control-A,当它出现在目录名中时

还有一个问题:使用像
sed.script
这样的固定名称作为临时文件名是不好的(由于多种原因-例如两个人试图在同一目录中同时运行脚本,但这也可能存在安全风险),因此使用
mktemp
创建临时文件名:

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
这将处理最常见的信号(HUP、INT、QUIT、PIPE、TERM),并删除临时文件,即使其中一个信号到达


显然,如果您只想简单地计算目录的数量,您可以通过
wc-l
来获取上述命令的输出。

做了需要做的事情吗?它在目录中查找文件;带有文件的目录不是空的,即使它不包含子目录。@JonathanLeffler很好的一点,它也适用于目录,根据手册页和
-键入d
,我们指定只查看目录。谢谢!现在我想计算这些子目录中有多少也包含目录。这就是我到目前为止所得到的:“find-mindepth 2-maxdepth 2”,但一个子目录包含多个目录,因此它被多次列出。我只想检查它是否有一个或多个,然后“添加”到我的列表中,而不是每次我在列表中找到一个目录时都取消添加。
ls -1d */*/. | cut -d / -f1 | uniq
ls -1d */*/. | cut -d / -f1 | uniq