在所有同名目录中查找最后一个深度目录

在所有同名目录中查找最后一个深度目录

我已经看到了这个问题:查找所有目录中同名的子目录

现在我的目录结构是:

$ find .

.
./4
./4/1
./2
./2/1
./5
./5/1
./1
./1/1
./3
./3/1

我想列出名称末尾带有“1”的所有目录:

./4/1
./2/1
./5/1
./1/1
./3/1

但我不想

./1

我尝试过以下命令:

find . -name "*1*"
find . -type d -path '*/1*'
find . -path '*/1*' -depth 2 -type d
find . -depth 2 -path '*/1*' -type d

更新

find . -depth 2

给出错误:

find: paths must precede expression: 2

找到了我的解决方案

find -mindepth 2 . -type d -path "*1*"

有人能解释为什么 -depth 不起作用而 -mindepth 起作用吗?

答案1

回答

find -mindepth 2 . -type d -path "*1*"

说明找到这里

- 选项:-maxdepth levels

下降到命令行参数之下最多levels(非负整数)个目录级别。-maxdepth 0意味着仅将测试和操作应用于命令行参数。

- 选项:-mindepth levels

不要在低于levels(非负整数)的级别应用任何测试或操作。-mindepth 1表示处理除命令行参数之外的所有文件。

- 选项:-depth

先处理每个目录的内容,然后再处理目录本身。在使用cpio 或生成要存档的文件列表时,这样做是个好主意。tar如果目录的所有者没有写入权限,则仍然可以从存档中恢复其内容,因为目录的权限是在其内容之后恢复的。

我对这些选项感到困惑。

答案2

有人能解释一下为什么工作-depth时不工作-mindepth吗?

我可以。-depth无法工作,-mindepth因为您使用了“错误”的实现find

你说得对您的答案 -depth与问题无关,也无法解决问题为你。您显然正在使用(并链接到 GNU 的文档)find;它支持-depth-mindepth并且-maxdepth与您的回答完全一致。

find在 FreeBSD 中支持-depth n

如果文件相对于遍历起点的深度为,则为 True n

你的-depth 2 与 FreeBSD 实现一起工作find

注意 FreeBSDfind 支持-depth(不带任何选项参数),其含义与-depthGNU 中的相同find-depthPOSIX.-depth n-mindepth n-maxdepth n是的各自实现中的不可移植扩展find

答案3

如果您不知道子目录的深度,可以使用常见文件系统(至少是 ext* 和 xfs)的快速简便的解决方案:

find -type d -links 2

在其他文件系统上,解决方案可能是:

find -type d | sort -r | awk 'a!~"^"$0{a=$0;print}' | sort

相关内容