引用 find 的手册页(GNU findutils 4.7.0,强调我的):
GNU find根据优先规则(参见PERATORS 部分),通过从左到右评估给定表达式来搜索以每个给定起点为根的目录树,直到结果已知(左侧为假)和操作, true for or ),此时 find 移动到下一个文件名。
因此,在find
评估时,<expr1> -and <expr2>
我希望<expr2>
除非<expr1>
为真,否则不会评估,我依靠它来避免一些错误消息,特别是,我不想find
测试不可读的目录是否为空。这是一个SCCCE:
mkdir some_dir
chmod 333 some_dir
find * -readable ! -empty -printf "yes" -or -printf "no" -prune
产生
find: ‘some_dir’: Permission denied
no
添加(否则为隐式)-and
和括号,评估的表达式find
应等效于
( ( -readable -and (! -empty ) ) -and -printf "yes" ) -or ( -printf "no" -and -prune )
因此,在意识到some_directory
不可读之后,find
应该放弃空性测试和评估-printf "yes"
。相反,它应该跳转到-printf "no"
和 finally的评估-prune
。输出中的“Permission denied”表明它正在评估-empty
。(从原始表达式中删除! -empty
会使错误消失。)
使用-D tree
检查评估树,我看到优化的形式(为了简洁和清晰而在此处编辑)是:
( ( ( ! -empty ) -and -readable ) -and -printf "yes" ) -or ( -printf "no" -and -prune )
根据哪个-empty
确实进行了评估,更糟糕的是,在此之前-readable
完全搞砸了预期的逻辑。我认为这是一个错误。我对吗?
更新:(2020 年 5 月 26 日)已提交错误报告,并已被开发人员确认为错误。