当find命令的-print与-depth参数输出结果相同时,二者有何差异?
关于
find命令-print与-depth参数的核心差异 嘿,这个问题抓得很准——虽然在某些场景下两者搭配后的输出看起来一模一样,但它们本质上是完全不同维度的参数,作用完全不重叠:
1. -print:负责「输出结果」的动作参数
-print是输出控制类参数,它的作用很直白:告诉find命令「把你找到的每一个匹配项的路径打印到标准输出」。
其实你平时直接敲find .的时候,find已经默认帮你加上了-print——这是它的默认输出动作,除非你指定了其他动作(比如-exec、-delete、-ls这些)。所以find .和find . -print的输出完全一致,只是前者省略了默认参数而已。
简单说,-print管的是「找到东西后要不要打印、怎么打印」,属于输出环节的设置。
2. -depth:负责「遍历顺序」的策略参数
-depth是遍历规则类参数,它控制的是find遍历目录树的顺序:
- 默认情况下,
find采用「先父后子」的遍历逻辑:先处理目录本身,再进入目录处理里面的内容。 - 加上
-depth后,find会切换成「先子后父」的深度优先遍历:先把目录里所有的文件、子目录内容处理完,最后再处理这个目录本身。
举个直观的例子,假设我们有这样的目录结构:
test/ ├── b.txt └── a/ └── c.txt
- 执行
find test(默认等价于find test -print),输出顺序是:test test/b.txt test/a test/a/c.txt - 执行
find test -depth(默认还是会用-print输出),输出顺序变成:test/b.txt test/a/c.txt test/a test
为什么有时候看起来输出一致?
只有当你的查找目标里没有子目录需要处理时(比如用-type f只找文件,或者遍历的目录本身没有子目录),-depth改变的遍历顺序才不会体现在输出里——因为所有匹配项都是文件,顺序的变化用户感知不到。但这时候find的底层遍历逻辑依然已经被-depth改变了,只是输出结果看起来和默认情况一样而已。
核心总结
-print:管「输出」,是告诉find找到内容后要打印出来,默认启用。-depth:管「遍历」,是告诉find要按先子后父的顺序遍历目录,默认不启用。
内容的提问来源于stack exchange,提问作者pkaramol
相关产品推荐
相关产品推荐

