查找树中的所有末端子目录

查找树中的所有末端子目录

给出以下结构:

oz123@debian:~/ $ tree .
.
├── a
│   ├── a1
│   ├── a2
│   └── a3
├── a1
│   ├── a11
│   ├── a12
│   └── a31
├── b
│   └── b1
│       ├── b11
│       │   └── b21
│       │       └── b31
│       ├── b12
│       └── b3
└── c

16 directories, 0 files

我如何找到所有终端节点?

我找到了以下解决方案似乎很好,但我必须证明没有测试用例会失败。

各州的帮助页面-links

您还可以使用“-links”搜索具有一定数量链接的文件。目录通常至少有两个硬链接;它们的 . 条目是第二个。如果它们有子目录,则每个子目录也有一个指向其父目录的名为 .. 的硬链接。除非在 find 命令行中提到 . 和 .. 目录条目,否则通常不会搜索它们。

可能的解决方案:

oz123@debian:~/ $ find .  -type d  -links 2
./a/a2
./a/a3
./a/a1
./c
./a1/a31
./a1/a11
./a1/a12
./b/b1/b12
./b/b1/b3
./b/b1/b11/b21/b31
  • 有人能提供更好的解决方案吗(无需使用管道和 sed,这已经是高性能了......)
  • 它可以在任何文件系统上运行吗?

答案1

https://stackoverflow.com/questions/4269798/use-gnu-find-to-show-only-the-leaf-directories

find . -type d -exec sh -c '(ls -p "{}"|grep />/dev/null)||echo "{}"' \;

慢于

find .  -type d  -links 2

反正。

答案2

尝试以下一行代码:

find . -type d -execdir sh -c 'test -z "$(find "{}" -mindepth 1 -type d)" && echo $PWD/{}' ';'

相关内容