encontra várias condições com vários executivos

3

Estou tentando criar um comando de localização com várias condições que levam a várias ações. Foi sugerido para mim que eu deveria usar apenas um comando de busca para eficiência. Aqui está o que eu tenho:

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

Parece que, na verdade, eu faço alguma coisa:

find: invalid expression

e

(: command not found

no script que estou tentando executar

    
por Angelo 13.09.2013 / 23:31

1 resposta

6

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 {} +
    
por 14.09.2013 / 02:17

Tags