查找多个执行者的多个条件

查找多个执行者的多个条件

我正在尝试构建一个具有多个条件的查找命令,这些条件会导致多个操作。有人建议我应该只使用一个 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,chgrpchmod调用可能以不同的速率进行,因此目录条目可能会从缓存中逐出,但我会尝试一下。

find "$target" \
        \( ! -group "$project" -exec chgrp "$project" {} +   \) \
        \( ! -user "$owner" -exec chown "$owner" {} +        \) \
        \( ! -perm "$perms" -exec chmod "$perms" {} +        \) \
        \( -type d -exec chmod g+s {} + \)

chgrp,如果文件已经具有正确的元数据,则不执行任何操作,因此您可以无条件地调用它们chmodchown然而,不必要地运行它们确实会导致更多调用。实用程序将在执行此操作stat后再次调用find,但索引节点很可能仍在缓存中,因此这可能是值得的。您可以通过合并chgrp到 来保存呼叫chown

find "$target" -exec chown "$owner:$project" {} + \
        -exec chmod "$perms" {} + \
        -type d -exec chmod g+s {} +

相关内容