我的问题解决方案
find . -type d -exec sh -c 'test $(find "$0" -maxdepth 1 -type d | wc -l) -eq 1' {} \; -print
我想知道,是否有更好(更快)的方法来做到这一点。我真的不喜欢从“找到”另一个查找过程开始。
答案 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%)。