複数の実行者の複数の条件を見つける

複数の実行者の複数の条件を見つける

複数のタスクを実行する複数の条件を使用してfindコマンドを作成しようとしています。誰かが効率を上げるには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

エラーメッセージは、(コマンドで実行されることを示します。これは、行を続行するために使用されるバックスラッシュの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 {} \; \)

ファイルごとに1回ではなく、ファイルごとに1回ずつコマンドを実行して時間を節約できます。ここでは保証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、ファイルにすでに正しいメタデータがある場合は、何もしないため、無条件に呼び出すことができますchmodchownしかし、不必要に実行すると、より多くの呼び出しが発生します。これを実行した後、ユーティリティはstat再度呼び出されますが、findinodeはまだキャッシュされている可能性が高いため、それは価値があります。chgrp通話をにマージして保存できますchown

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

関連情報