我正在搜索包含一组字符串之一的所有文件。如果他们这样做,我会更改他们的访问权限。
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是假的。