Ok, reli as páginas de manual "chmod" para Mac OS X, BSD e Linux e fiz alguns experimentos. Aqui está o que eu aprendi sobre modos simbólicos. Pode ser complicado, mas vale a pena entender:
- A forma geral é a cláusula [, cláusula …] onde:
- cláusula : = [ugoa] [+ - =] [rwxXstugo]
- [ugoa] ( quem ) (especificar vários) significa definir a permissão para usuário, grupo, outro ou todos. Se não especificado, o padrão é 'a', mas o umask está em vigor.
- [+ - =] ( ação ) (especifique um) significa:
- + significa adicionar as permissões especificadas às permissões já em vigor
- - significa remover as permissões especificadas das permissões já em vigor
- = significa definir as permissões para as permissões especificadas, limpando todas as outras
- [rwxXstugo] ( permissão ) (especifique vários de rwxXst OU um do ugo) define as permissões para o (s) usuário (s) especificado (s) da seguinte maneira:
- r - leia
- w - escrever
- x - executar / pesquisar
- X - execute / pesquise o diretório iff OU qualquer bit de execução já foi definido.
- s - suid ou sgid
- t - pegajoso
- u - copiar permissão do usuário
- g - permissão de grupo de cópias
- o - copiar outra permissão
Por exemplo, a+x
tornaria um arquivo executável por todos. a+X
tornaria um arquivo executável por todos, se tivesse sido executável por alguém.
a+x
tornaria um diretório pesquisável por todos. a+X
também tornaria um diretório pesquisável por todos.
A principal diferença entre o BSD e o Linux é que, com o BSD, a determinação é feita com base nas permissões do arquivo antes da execução do chmod. Enquanto no Linux, a determinação é feita imediatamente antes da cláusula + X ser executada.
Assim, com o BSD, a combinação a-x,a+X
removeria a permissão de execução / pesquisa e tornaria um diretório pesquisável por todos, e tornaria um arquivo executável por todos, se originalmente fosse executável por alguém.
Com o Linux, a-x,a+X
removeria a permissão de execução / pesquisa e tornaria um diretório pesquisável por todos, deixando um arquivo executável por ninguém.
Aqui está um exemplo concreto: em uma máquina BSD: um diretório, um arquivo executável e um arquivo não executável:
drwxr-x--- 2 falk staff 68 Jul 19 18:01 fee/
-rwxr-x--- 1 falk staff 0 Jul 19 18:01 fie*
-rw-r----- 1 falk staff 0 Jul 19 18:01 foe
Observe que o diretório e "fie" são executáveis / pesquisáveis pelo usuário, mas não por outros.
Agora nós executamos chmod a-x,a+X *
. A primeira cláusula retira o bit de execução / pesquisa de todos os usuários para todos os arquivos, mas a segunda cláusula o adiciona novamente para "fee" e "fie". "fee" porque é um diretório e "fie" porque tinha pelo menos um bit executável para começar.
drwxr-x--x 2 falk staff 68 Jul 19 18:01 fee/
-rwxr-x--x 1 falk staff 0 Jul 19 18:01 fie*
-rw-r----- 1 falk staff 0 Jul 19 18:01 foe
Eu tive o mesmo resultado em execução chmod -x+X
.
Conclusão: A solução de Jak Gibb funcionará no Linux, mas para o BSD, você precisaria fazer duas passagens.
Não testei isso no SVr4 ou em outras variantes do Unix.