Como posso alterar as permissões de arquivo e diretório de uma só vez via SSH?

0

Estou tentando usar find em conjunto com -exec e chmod para alterar de forma recursiva as permissões em todos os arquivos e diretórios dentro de uma pasta via SSH.

Eu quero fazer estes dois comandos em uma linha:

find /share/Multimedia/ -type f -exec chmod 644 {} \;
find /share/Multimedia/ -type d -exec chmod 755 {} \;

Consegui encontrar uma solução antes de alguém postar em algum lugar e, por alguma razão, meu histórico de comandos do bash foi limpo e não anotei a sintaxe que estava usando em outro lugar como referência. Eu não costumo fazer isso, então eu não sou muito experiente em comandos Unix padrão.

Eu estava usando algo nos moldes de:

# probably won't execute
find /share/Multimedia/ ( if -type f -exec chmod 644 {} \; else if -type d -exec chmod 755 {} \; )

Eu só quero executar isso no meu NAS de vez em quando para normalizar as permissões de uma só vez, possivelmente sem supervisão para fazer outra coisa enquanto meu NAS o processa.

    
por SebinNyshkim 15.11.2016 / 23:30

2 respostas

1

Você pode aproveitar a estrutura e / ou o sistema de expressão de find para fazer isso:

find /share/Multimedia/ -type f -exec chmod 644 {} \; -o -type d -exec chmod 755 {} \;

Essencialmente, isso tem a seguinte lógica:

IF:
    the item is a plain file
    AND the chmod 644 command succeeds on it
OR
    the item is a directory
    AND the chmod 755 command succeeds on it
THEN
    ... well, do nothing; normally it'd print the item's path, but since
    there's a -exec in the expression, that gets skipped

Mas há uma maneira muito mais simples:

chmod -R u=rwX,go=rX /share/Multimedia/

Isso tira proveito da permissão "X" de chmod , que significa "executar, mas somente se fizer sentido". Principalmente, isso significa que ele é executado em diretórios, mas não em arquivos simples. O principal problema em potencial é que, se ele vê uma permissão de execução em um arquivo simples, assume que é intencional e a mantém, portanto, isso não será limpo depois que alguém passar e atribuir a permissão de execução a tudo.

    
por 16.11.2016 / 05:32
2

Primeiro de tudo, if é uma palavra-chave para shell, não para find, você não pode usá-lo como uma opção.

Em segundo lugar, provavelmente você está procurando por algo assim:

find /share/Multimedia/ -exec sh -c 'if [ -f {} ]; then chmod 644 {}; else chmod 755 {}; fi' \;

Estamos apenas verificando se o elemento é um arquivo com nosso shell com if [ -f {} ] , então chmod como você queria para um arquivo ou diretório.

    
por 15.11.2016 / 23:46