我正在尝试构建一个具有多个条件的查找命令,这些条件会导致多个操作。有人建议我应该只使用一个 find 命令以提高效率。这是我所拥有的:
find $target \
\( ! -group $project -exec chgrp $project "{}" \; \) , \
\( ! -user $owner -exec chown $owner "{}" \; \) , \
\( ! -perm "$perms" -exec chmod "$perms" "{}" \; \) , \
\( -type d -exec chmod g+s "{}" \; \)
它似乎确实做了一些事情,但是我得到:
查找:无效表达式
和
(: 找不到命令
在我试图执行的脚本中
答案1
错误消息表明它(
是作为命令执行的,这意味着用于继续行的反斜杠之一实际上不是该行的最后一个字符。确保没有空格。确保您使用的是 Unix 行结尾(仅 LF,无 CR)。
find
关于无效表达式的投诉是由于这些逗号造成的。只需删除它们即可。
find "$target" \
\( ! -group "$project" -exec chgrp "$project" {} \; \) \
\( ! -user "$owner" -exec chown "$owner" {} \; \) \
\( ! -perm "$perms" -exec chmod "$perms" {} \; \) \
\( -type d -exec chmod g+s {} \; \)
您可能会节省每批文件运行一次命令的时间,而不是每个文件运行一次。这里不能保证这一点,因为chown
,chgrp
和chmod
调用可能以不同的速率进行,因此目录条目可能会从缓存中逐出,但我会尝试一下。
find "$target" \
\( ! -group "$project" -exec chgrp "$project" {} + \) \
\( ! -user "$owner" -exec chown "$owner" {} + \) \
\( ! -perm "$perms" -exec chmod "$perms" {} + \) \
\( -type d -exec chmod g+s {} + \)
chgrp
,如果文件已经具有正确的元数据,则不执行任何操作,因此您可以无条件地调用它们chmod
。chown
然而,不必要地运行它们确实会导致更多调用。实用程序将在执行此操作stat
后再次调用find
,但索引节点很可能仍在缓存中,因此这可能是值得的。您可以通过合并chgrp
到 来保存呼叫chown
。
find "$target" -exec chown "$owner:$project" {} + \
-exec chmod "$perms" {} + \
-type d -exec chmod g+s {} +