4

我有我的问题的解决方案

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

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

4

2 回答 2

4

man find将列出一个选项:

   -links n
          File has n links.

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

find . -type d -links 2

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

于 2013-07-25T12:25:13.507 回答
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 的命令快得多(快 250-300%)find | wc

于 2013-07-25T14:55:27.670 回答