我在 macOS 机器上有以下目录结构:
dir1/
|- file1.txt
|- dir2/
|- file2.txt
|- dir3
|- file3.txt
然后我运行这两个find
命令:
find . -depth 1 -path '*.txt'
find . -mindepth 1 -maxdepth 1 -path '*.txt'
目标是非递归搜索.txt
中的所有文件dir1
。如果在 中使用dir1
,两个命令都会返回file1.txt
,但我被告知只有第二个命令(带有-mindepth
和-maxdepth
)才是正确的。真的是这样吗?有人能解释一下区别吗?
第二个问题是,如果我需要递归搜索,我应该-mindepth 1 -maxdepth 1
全部删除还是只删除-maxdepth 1
一部分?
-depth 1
来自 FreeBSD 的是一个条件谓词,如果当前正在考虑的文件位于深度 1,则返回 true,但它不会停止find
下降到深度 1 以下。-mindepth 1
/-maxdepth 1
来自 GNU 是选项谓词(在 GNUfind
术语中),它们会全局影响 的行为find
。它们都始终返回 true(并且通常您希望它们在开始时就返回,而不需要依赖它们的结果),-mindepth 1
确保深度低于 1 的文件不会被选择或操作-maxdepth 1
导致find
无法下降到深度 1 以下。-depth 1
根据深度执行不同的操作很有用,例如:但为了仅处理深度 1 的文件,
或者标准等价物:
就是你想要的。
-mindepth
/可以通过和的-maxdepth
组合来模拟,但是/比¹ 更具可移植性,¹ 仅适用于 FreeBSD(以及 macOS 或 DragonFly BSD 等衍生产品),因此这样做没有什么意义。-depth n
-prune
-mindepth
-maxdepth
-depth n
¹ 不要与
-depth
单独混淆,单独使用一个选项谓词来开启标准的深度优先遍历。