我已经看到了这个问题:查找所有目录中同名的子目录
现在我的目录结构是:
$ 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
(不带任何选项参数),其含义与-depth
GNU 中的相同find
。-depth
POSIX.-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