Chmod recursivamente
Tengo un archivo comprimido, que fue archivado por otra persona, y quiero cambiar automáticamente, después de descargarlo, una rama del sistema de archivos dentro de los archivos extraídos para obtener acceso de lectura. (No puedo cambiar cómo se crea el archivo).
He investigado este hilo: chmod: Cómo agregar recursivamente permisos de ejecución solo a archivos que ya tienen permiso de ejecución como en otros, pero no es divertido.
Los directorios originalmente vienen con múltiples indicadores pero todos incorrectos; pueden aparecer como:
drwx------
d---r-x---
drwxrwxr-x
dr--r-xr--
Estos son sólo los pocos que he descubierto hasta ahora, pero podrían ser más.
find
errores cuando intenta buscar en un directorio sin x
permiso y, por lo tanto, no lo pasa a chmod
. Lo que he estado haciendo hasta ahora es cambiar manualmente los permisos en el directorio principal, luego ir a los directorios secundarios y hacer lo mismo con ellos, y así sucesivamente. Pero esto es mucho trabajo manual. ¿No hay alguna manera de hacer esto automáticamente?
Es decir, cómo lo estoy haciendo ahora:
hacer:
$ chmod -R +x
$ chmod -R +r
hasta que no tenga errores, entonces
$ find -type f -exec chmod -x {} +
Pero debe haber una manera mejor.
Puede usar chmod con la X
letra de modo (la X mayúscula) para configurar el indicador ejecutable solo para directorios.
En el siguiente ejemplo, el indicador ejecutable se borra y luego se configura para todos los directorios de forma recursiva:
~$ mkdir foo
~$ mkdir foo/bar
~$ mkdir foo/baz
~$ touch foo/x
~$ touch foo/y
~$ chmod -R go-X foo
~$ ls -l foo
total 8
drwxrw-r-- 2 wq wq 4096 Nov 14 15:31 bar
drwxrw-r-- 2 wq wq 4096 Nov 14 15:31 baz
-rw-rw-r-- 1 wq wq 0 Nov 14 15:31 x
-rw-rw-r-- 1 wq wq 0 Nov 14 15:31 y
~$ chmod -R go+X foo
~$ ls -l foo
total 8
drwxrwxr-x 2 wq wq 4096 Nov 14 15:31 bar
drwxrwxr-x 2 wq wq 4096 Nov 14 15:31 baz
-rw-rw-r-- 1 wq wq 0 Nov 14 15:31 x
-rw-rw-r-- 1 wq wq 0 Nov 14 15:31 y
Un poco de explicación:
chmod -x foo
- borre el indicador ejecutable parafoo
chmod +x foo
- establecer el indicador ejecutable parafoo
chmod go+x foo
- Igual que arriba, pero establezca la bandera solo para Grupo y Otros usuarios, no toque el permiso de Usuario (propietario)chmod go+X foo
- Igual que el anterior, pero se aplica sólo a directorios, no toque archivos.chmod -R go+X foo
- Igual que arriba, pero haga esto de forma recursiva para todos los subdirectorios defoo
Necesita acceso de lectura, además de acceso de ejecución, para listar un directorio. Si solo tiene acceso de ejecución, entonces puede encontrar los nombres de las entradas en el directorio, pero ninguna otra información (ni siquiera los tipos, por lo que no sabe cuáles de las entradas son subdirectorios). Esto funciona para mí:
find . -type d -exec chmod +rx {} \;
Intenta cambiar todos los permisos al mismo tiempo:
chmod -R +xr