find . -type d
通常会显示
./dir1
./dir1/dir2
./dir3
./dir3/dir4
./dir3/dir4/dir5
...
我只想要
./dir1/dir2
./dir3/dir4/dir5
, 没有它的父 ./dir1, ...
换句话说,我只想查看其中没有任何子目录的目录。
任何想法?
编辑:我发现-links 2
在正常的 linux 环境中确实可以工作,例如,
docker run -it --rm ubuntu:bionic find /etc -type d -links 2
完美运行。
但是,当我将一个目录(从 MacOS 或 Windows)挂载到 docker 容器中时,事情发生了变化,它不起作用,你可以试试这个:
docker run -it --rm -v /etc:/etc_of_host ubuntu:bionic find /etc_of_host -type d -links 2
与
zsh
:或者直接不带中介功能:
那是:
fn() some-command
定义一个fn
函数,some-command
就像在 Bourne-shell 和大多数 Bourne-like shell 中一样。() { code } args
作为位置参数运行的匿名函数code
。args
(( $# ))
此处,该匿名函数的主体是一个算术表达式,如果(参数的数量)非零,则该表达式解析为真。$#
${param-default}
(来自 Bourne shell)扩展为$param
是否设置了参数default
。在这里${1-$REPLY}
,我们允许我们的函数被直接调用(ashas_subdirs mydir
)或作为一个通配符函数,如下所示。$dir/*(ND/Y1)
扩展为$dir
(/
) 中目录类型的文件,包括隐藏文件 (D
otglob),如果没有匹配项 (ullglob),则不会出错N
。但是Y1
,我们在第一场比赛中停止。has_subdirs
因此,如果目录包含至少一个子目录,匿名函数(因此)将返回 true。print -rC1
在olumn上打印其参数r
aw1
C
^+has_subdirs
仅限于has_subdirs
函数不 (^
) 返回 true 的文件。如果您必须使用
bash
外壳,只需执行以下操作:或者将结果存储在 bash 数组中(需要 bash-4.4+):
(使用 NUL 分隔的记录以便能够存储任意路径)。
如果你没有
zsh
,但你有perl
,你可以这样做:或者如果你有 GNU
awk
:那些首先
find
打印目录深度(在他们所在的分支之前离开)并获取perl
/awk
以打印未找到的记录,然后/
在上一条记录的开头打印。同样,要将文件存储在 bash 4.4+ 数组中,您需要通过将
-l
after-0
inperl
或 add-v 'ORS=\0'
in切换到输出上的 NUL 分隔记录gawk
:在某些系统和文件系统(例如
ext4
基于 Linux 的系统上的文件系统)上,您可能能够依赖于这样一个事实,即具有子目录的目录的链接数大于 2(dir
以及dir/.
每个附加链接dir/subdir/..
)。或
find
在任何外壳中使用:这将不起作用
btrfs
(在几个 Linux 发行版中已被替换ext4
为默认文件系统),例如目录的链接计数始终为 1,因此我不建议将其作为一般解决方案。与您的情况相同的联合文件系统,例如
overlayfs
我发现一些合并目录的链接计数为 1,无论它们是否包含子目录。但是,无论它在哪里可用,if 都比手动计算不需要对目录的读取访问权限的子目录的解决方案具有优势(仅搜索对其父目录的访问权限)。
你要找的是:
文件系统中的每个目录至少有两个硬链接——父目录中的目录本身和“.”。入口。子目录中的每个“..”条目都会为目录添加一个新的硬链接。所以你只需要找到有两个硬链接的目录。
另一个答案中建议的命令
做同样的事情,但声明“目录少于三个硬链接”。
最排序的:
在一行中
正如操作所提到的:
阅读
man find
。该-mindepth
选项是您想要的。