Existe um sinalizador correspondente a x / X, mas para s com chmod no Linux?

5

Ao usar chmod (no meu caso parte de coreutils 8.12), e definindo recursivamente o x bit, existe o conveniente X (letra maiúscula x), para definir o bit somente nos diretórios. Então, se você quisesse remover o x de todos os arquivos e deixá-lo apenas em pastas, você poderia incluir isso em uma única chamada como esta:

chmod -R a-x,a+X /path/to/folder

Isso é especialmente útil se você trabalha com alguém cuja concepção de sistemas unixóides se origina na década de 1980 e o octal 755 é tudo o que eles sabem.

No entanto, eu não encontrei tal coisa para o s bit, apesar do fato de que existe uma dualidade semelhante no significado do bit em arquivos versus pastas. Estou me referindo a chmod(1) , em particular o comportamento setgid . Então, se eu fizer:

chmod -R g+ws /path/to/folder

Acabo com pastas de arquivos e com o bit definido, quando tudo que eu quero é configurá-lo em pastas para que os arquivos criados sempre sejam de propriedade do grupo proprietário automaticamente.

Existe uma maneira conveniente, curta de:

find /path/to/folder -type d -exec chmod g+s {} \;

???

    
por 0xC0000022L 12.09.2013 / 00:22

2 respostas

3

Quando você usa a opção -R para chmod , está dizendo que deseja aplicar a alteração de permissões em questão aos arquivos e à pasta de forma recursiva.

Não é possível dizer a chmod para aplicar essas configurações apenas a uma ou outra, portanto, você só precisa recorrer à ajuda de uma ferramenta como find para construir a lista de diretórios e então exec o comando chmod seletivamente contra essa lista.

Você pode tornar isso mais eficiente chamando chmod via exec chamando-o assim, usando a variante + do comando exec :

$ find /path/to/folder -type d -exec chmod g+s {} +
    
por 12.09.2013 / 01:15
2

Não há como fazer isso com chmod sozinho. No zsh, você pode aproveitar os qualificadores recursivos de globbing e glob:

chmod g+ws /path/to/folder/**/*(/)

Em ksh, você pode fazer isso, mas também operará em links simbólicos para diretórios.

set -o globstar
chmod g+ws /path/to/folder/**/*/

No bash, você pode fazer isso, mas também irá percorrer links simbólicos para diretórios durante a descida recursiva.

shopt -s globstar
chmod g+ws /path/to/folder/**/*/

Em vez de usar o bit setgid nos diretórios, você pode usar uma ACL padrão nos diretórios para tornar os arquivos graváveis por um grupo.

setfacl -d -m g:somegroup:rwx /path/to/folder/**/*(/)
setfacl -m g:somegroup:rwx /path/to/folder/**/*(/)
    
por 12.09.2013 / 01:51

Tags