linux 中有没有办法只查看目录树中那些是分支末端的目录(我在这里称它们为叶子),即其中没有子目录的目录?我看了这个问题,但从未正确回答。
所以如果我有一个目录树
root/
├── branch1
│ ├── branch11
│ │ └── branch111 *
│ └── branch12 *
└── branch2
├── branch21 *
└── branch22
└── branch221 *
我可以只找到其分支末尾的目录(标有*
的目录),所以只查看目录数量,而不是文件数量?在我的真实案例中,我正在寻找带有文件的文件,但它们是我想在这个例子中找到的“叶子”的一个子集。
要仅查找那些包含非目录文件的叶目录,您可以结合参考问题https://unix.stackexchange.com/a/203991/330217或类似问题https://stackoverflow.com/a/的答案4269862/10622916或https://serverfault.com/a/530328与
find
_! -empty
检查硬链接
-links 2
应该适用于传统的 UNIX 文件系统。该-empty
条件不是 POSIX 标准的一部分,但应该在大多数 Linux 系统上都可用。根据 KamilMaciorowski 的评论,目录的传统链接计数语义对 Btrfs 无效。这在https://linux-btrfs.vger.kernel.narkive.com/oAoDX89D/btrfs-st-nlink-for-directories中得到证实,其中还提到 Mac OS HFS+ 作为传统行为的一个例外。对于这些文件系统,需要使用不同的方法来检查叶目录。
您可以使用嵌套
find
并计算子目录的数量:与
zsh
:$leafdirs
使用匹配的叶目录列表设置数组。您可以使用以下命令在 olumn 上
print
列出r
aw1
C
:或者循环它们:
这或多或少是@Bodo 的 GNU
find
answer的翻译,所以它只适用于传统的类 Unix 文件系统,如ext4
该工具.
和..
实际的目录条目。**/
: 任何级别的子目录(NDFl2)
: 全局限定符N
: 为那个 glob 启用nullglob
:如果没有匹配,不要失败。相反,会导致一个空列表D
: 为那个 glob 启用dotglob
:查看隐藏目录,不要跳过隐藏文件F
: 选择完整目录:包含除.
and以外的至少一个条目的目录..
(如 GNUfind
的-type d ! -empty
)l2
: 只有链接数为 2 的目录(如-links 2
)。一个用于目录在其父目录中的条目,另一个用于.
其中。..
由于其中的条目,任何子目录都会将链接计数加一。在不能使用 nlinks == 2 的文件系统上,您可以执行以下操作:
我们使用
e
限定符(用 否定^
)运行代码来检查目录(存储在$REPLY
该代码中)是否有子目录,这里使用匿名函数来检查 的扩展$REPLY/*(ND/Y1)
,目录是否$REPLY
在第一个匹配处停止,作为其参数传递的是一个非空列表($#
非零)。如果
*/
文件名通配模式扩展为不是目录名称的内容,则当前目录没有(非隐藏的)子目录。与
find
:请注意,这会将指向叶目录中目录的符号链接视为目录,因为该模式将遍历符号链接。
-empty
谓词不是标准的,但经常实现。没有它,您将执行与检测子目录类似的操作:或者,更有效一点,
或者,使用
-links
我忘记的谓词(感谢 Bodo):