Ok, releí las páginas de manual "chmod" para Mac OS X, BSD y Linux, e hice algunos experimentos. Esto es lo que aprendí sobre los modos simbólicos. Puede complicarse, pero vale la pena entenderlo:
- La forma general es la cláusula [, cláusula ...] donde:
- cláusula : = [ugoa] [+ - =] [rwxXstugo]
- [ugoa] ( quién ) (especificar múltiples) significa establecer el permiso para usuario, grupo, otro o todos. Si no se especifica, el valor predeterminado es 'a', pero la umask está vigente.
- [+ - =] ( acción ) (especifique uno) significa:
- + significa agregar los permisos especificados a los permisos ya vigentes
- - significa eliminar los permisos especificados de los permisos ya vigentes
- = significa establecer los permisos a los permisos especificados, borrando todos los demás
- [rwxXstugo] ( permiso ) (especifique el múltiplo de rwxXst O uno de ugo) establece los permisos para los usuarios especificados de la siguiente manera:
- r - leer
- w - escribir
- x - ejecutar / buscar
- X - ejecutar / buscar directorio iff O cualquier bit de ejecución ya estaba establecido.
- s - suid o sgid
- t - pegajoso
- u - copia el permiso del usuario
- g - copiar permiso de grupo
- o - copiar otro permiso
Entonces, por ejemplo, a+x
haría un archivo ejecutable por todos. a+X
haría que un archivo fuera ejecutable por todos SI hubiera sido ejecutable por alguien.
a+x
haría que todos pudieran buscar un directorio. a+X
también haría que todos pudieran buscar un directorio.
La diferencia clave entre BSD y Linux es que con BSD, la determinación se realiza en función de los permisos del archivo antes de ejecutar chmod. Mientras que con Linux, la determinación se realiza inmediatamente antes de que se ejecute la cláusula + X.
Entonces, con BSD, la combinación a-x,a+X
eliminaría el permiso de ejecución / búsqueda y luego haría que todos pudieran buscar un directorio, y haría que un archivo fuera ejecutable por todos si originalmente hubiera sido ejecutable por alguien.
Con Linux, a-x,a+X
eliminaría el permiso de ejecución / búsqueda y luego haría que todos pudieran buscar un directorio, mientras que nadie dejaría un archivo ejecutable.
Aquí hay un ejemplo concreto: en una máquina BSD: un directorio, un archivo ejecutable y un archivo no ejecutable:
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 tanto el directorio como "fie" son ejecutables / buscables por el usuario, pero no por otros.
Ahora ejecutamos chmod a-x,a+X *
. La primera cláusula eliminará el bit de ejecución / búsqueda de todos los usuarios para todos los archivos, pero la segunda cláusula lo agregará de nuevo para "tarifa" y "fie". "tarifa" porque es un directorio, y "fie" porque tenía al menos un bit ejecutable para empezar.
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
Tuve el mismo resultado al ejecutar chmod -x+X
.
Conclusión: la solución de Jak Gibb funcionará en Linux, pero para BSD, necesitaría hacer dos pases.
No probé esto en SVr4 u otras variantes de Unix.