Como chmod apenas em subdiretórios?

5

Dada a seguinte árvore de diretórios:

.
├── d1
│   └── workspace
├── d2
│   └── workspace
├── d3
│   └── workspace
├── d4
│   └── workspace
└── d5
    └── workspace

Eu preciso definir as permissões para todos os diretórios workspace , conforme abaixo:

chmod -R 774 d1/workspace
chmod -R 774 d2/workspace
...

Como posso fazer as operações acima em um comando para todos os diretórios workspace ? Eu posso executar o seguinte comando:

chmod -R 774 *

Mas isso também muda o modo dos diretórios pai, o que não é desejado.

    
por Meysam 18.03.2018 / 08:13

4 respostas

15

Você pode usar curingas no diretório de nível superior.

chmod 774 d*/workspace

Ou, para torná-lo mais específico, você também pode limitar o curinga, por exemplo, a d seguido por um único dígito.

chmod 774 d[0-9]/workspace

Uma abordagem mais geral poderia estar com find .

find d* -maxdepth 1 -name workspace -type d -exec chmod 774 "{}" \;
    
por 18.03.2018 / 08:58
4

Em um shell como bash , você pode usar sua opção extended globbing para primeiro marcar todos os diretórios chamados workspace e chmod em uma única chance

shopt -s nullglob globstar

A opção nullglob é certificar-se de que a expansão glob não lança nenhum erro quando não encontra nenhum arquivo no caminho. Isso também garantirá que a cadeia vazia de glob não seja incluída como parte da matriz. A opção globstar está ativada para globalização recursiva.

Agora marque esses diretórios em uma matriz de shell como

dirs=(**/workspace/)

Como mais uma verificação de sanidade, você pode primeiro imprimir a matriz para ver se todos os diretórios necessários foram atendidos. Veja se todos os diretórios estão listados abaixo quando você faz o comando printf() abaixo,

printf '%s\n' "${dirs[@]}"

Isso preencherá o array com todas as pastas workspace recursivas, agora precisamos usar chmod

(( "${#dirs[@]}" )) && chmod -R 774 -- "${dirs[@]}"
    
por 18.03.2018 / 08:52
0

O comando chmod tem um bom atalho para configurar o bit executável somente em diretórios, da seguinte forma:

chmod a+X *

Isso é muito útil para tornar uma árvore de diretórios inteira legível por qualquer pessoa, mas não definindo o bit executável em nenhum arquivo normal:

chmod -R a+rX *
    
por 18.03.2018 / 11:51
-1
find . -mindepth 1 -type d -exec chmod 774 {} \;
    
por 19.11.2018 / 14:22