find (-exec) 的评估

find (-exec) 的评估

我正在搜索包含一组字符串之一的所有文件。如果他们这样做,我会更改他们的访问权限。

 find . -type f -exec grep -q '#!/bin/bash\|#!/usr/bin/grep\|#!/usr/bin/awk' {} \; -exec chmod 700 {} ;\

grep -q我很好奇当 find 找到包含该字符串的文件时它是如何工作的,0所以另一个 exec 执行但不应该执行。那一秒exec找到所有文件并更改所有文件的权限。为什么它可以工作并且只更改那些包含该字符串的文件?

答案1

我不确定你的意图是什么(你没有说清楚),但是如果是 chmod 到 700 所有与模式匹配的文件,那么,除了你的拼写错误(;\而不是\;),你的命令似乎工作如下故意的。

然而:

当它找到包含该字符串的文件时,grep -q我会0得到另一个 exec 执行但不应该执行的文件。

是的,应该这样做。 0 表示成功意味着 true,因此find继续计算其表达式,第二个-exec运行。 1(或 0 以外的任何值)意味着失败意味着 false,因此find会短路其计算(并列表达式之间存在隐式逻辑 AND),因此第二个-exec不会运行。

为什么它有效

检查 GNU 的联机帮助页find

表达式1 表达式2

一行中的两个表达式被视为用隐含的“and”连接;表达式2不评估如果表达式1是假的。

相关内容