列出所有不包含子目录的目录

时间:2013-07-25 12:07:11

标签: bash find

我的问题解决方案

find . -type d -exec sh -c 'test $(find "$0" -maxdepth 1 -type d | wc -l) -eq 1' {} \; -print

我想知道,是否有更好(更快)的方法来做到这一点。我真的不喜欢从“找到”另一个查找过程开始。

2 个答案:

答案 0 :(得分:4)

man find会列出一个选项:

   -links n
          File has n links.

您正在寻找仅包含两个链接的目录(即.及其名称)。以下将返回没有子目录的目录:

find . -type d -links 2

普通Unix文件系统上的每个目录至少有2个硬链接:其名称及其.(父目录)条目。此外,其子目录(如果有)每个都有一个链接到该目录的..条目。

答案 1 :(得分:1)

按照命令进行更多编码也应该有效:

find . -type d|awk 'NR>1{a[c++]=$0; t=t $0 SUBSEP} END{for (i in a) {if (index(t, a[i] "/") > 0) delete a[i]} for (i in a) print a[i]}'

让它更具可读性:

find . -type d | awk 'NR > 1 {
   a[c++]=$0;
   t=t $0 SUBSEP
}
END {
   for (i in a) {
      if (index(t, a[i] "/") > 0)
         delete a[i]}
   for (i in a)
      print a[i]
}'

虽然在这个解决方案中可能看起来更像编码,但在一个大目录中,这个基于awk的命令应该比嵌入式find | wc解决方案运行得快得多,如问题所示。

效果测试:

我在一个包含15k +嵌套子目录的目录上运行它,发现这个awk命令比OP的find | wc命令快得多(比原来快250-300%)。