A mensagem de erro indica que (
foi executado como um comando, o que significa que uma das barras invertidas usadas para continuação de linha não é, na verdade, o último caractere da linha. Certifique-se de que não há espaço em branco. Certifique-se de estar usando finais de linha do Unix (apenas LF, sem CR).
A reclamação de find
sobre uma expressão inválida é devido a essas vírgulas. Apenas remova-os.
find "$target" \
\( ! -group "$project" -exec chgrp "$project" {} \; \) \
\( ! -user "$owner" -exec chown "$owner" {} \; \) \
\( ! -perm "$perms" -exec chmod "$perms" {} \; \) \
\( -type d -exec chmod g+s {} \; \)
Você provavelmente economizará tempo executando os comandos uma vez por lote de arquivos, em vez de uma vez por arquivo. Isso não é garantido aqui porque as chamadas chown
, chgrp
e chmod
podem continuar em taxas diferentes, portanto, as entradas de diretório podem ser despejadas do cache, mas daria uma olhada.
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
e chown
não fazem nada se o arquivo já tiver os metadados corretos, para que você possa chamá-los incondicionalmente. Executá-los desnecessariamente causa mais chamadas, no entanto. Os utilitários chamarão stat
novamente depois de find
ter feito isso, mas é muito provável que os inodes ainda estejam no cache, então isso pode valer a pena. Você pode salvar uma chamada combinando chgrp
em chown
.
find "$target" -exec chown "$owner:$project" {} + \
-exec chmod "$perms" {} + \
-type d -exec chmod g+s {} +