使用GNU find仅显示叶子目录

Tho*_*nry 40 bash shell gnu find

我正在尝试使用GNU find来查找不包含其他目录的目录,但可能包含也可能不包含常规文件.

到目前为止,我最好的猜测是:

find dir -type d \( -not -exec ls -dA ';' \)
Run Code Online (Sandbox Code Playgroud)

但这只是给我一长串"."

谢谢!

Syl*_*sne 78

如果您的文件系统符合POSIX,则可以使用-links(即,目录中包含每个子目录的链接,来自其父级的链接和指向self的链接,因此如果没有子目录,则计数为2个链接).

以下命令应该执行您想要的操作:

find dir -type d -links 2
Run Code Online (Sandbox Code Playgroud)

但是,它似乎不适用于Mac OS X(正如@Piotr所提到的).这是另一个较慢的版本,但可以在Mac OS X上运行.它基于他的版本,通过更正来处理目录名称中的空格:

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

  • 同样,简单的解决方案似乎在 Cygwin(Windows 7)中不起作用,但扩展的 OSx 版本却可以 (2认同)
  • 在我的 btrfs 系统目录中,链接计数为 1,因此这不起作用。 (2认同)

Ahm*_*gle 5

我刚刚发现了另一种适用于Linux和macOS(无find -exec)的解决方案!

它涉及sort(两次)和awk:

find dir -type d | sort -r | awk 'a!~"^"$0{a=$0;print}' | sort
Run Code Online (Sandbox Code Playgroud)

说明:

  1. find以相反的顺序对输出进行排序

    • 现在你首先出现子目录,然后是他们的父母
  2. 使用awk省略行,如果当前行是前一行的前缀

    • (这个命令来自这里答案)
    • 现在你删除了"所有父目录"(你留下了父目录)
  3. sort他们(所以它看起来像正常的find输出)
  4. 瞧!快速便携.