Chmod recursivamente

249

Tengo un archivo, que está archivado por otra persona, y quiero automáticamente, después de descargarlo, cambiar 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 examinado este hilo: chmod: cómo agregar de forma recursiva permisos de ejecución solo a archivos que ya tienen permiso de ejecución como en algunos otros, pero no es un placer.

Los directorios originalmente vienen con varios indicadores pero todos incorrectos, pueden aparecer como:

drwx------
d---r-x---
drwxrwxr-x
dr--r-xr--

Esos son los pocos que he descubierto hasta ahora, pero podrían ser más.

finderrores cuando se trata de buscar en un directorio sin xpermiso, y así no 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 por ellos, y así sucesivamente. Pero esto es mucho trabajo manual. ¿No hay alguna forma 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 mejor manera.

Comunidad
fuente
3
-r no es lo mismo que -R
PJ Brunet
Nota miscelánea, si desea decir que todos los permisos de grupo coincidan con los permisos del propietario (parece menos probable que elimine todo IMO) eso es totalmente posible en serverfault.com/a/284478/210994
ThorSummoner

Respuestas:

131

Necesita acceso de lectura, además de ejecutar el acceso, para listar un directorio. Si solo tiene acceso de ejecución, 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 mi:

find . -type d -exec chmod +rx {} \;
Fred Foo
fuente
2
Cuál es la diferencia entre '\;' y '+' que fue utilizado por el OP al final del comando?
kon psych
1
@konpsych Aparentemente +construye la línea de comandos de una manera diferente. En realidad no era consciente de ello; \;es la forma habitual, con un comando por archivo que coincide con la búsqueda.
Fred Foo
No funciona si algunos archivos tienen espacios en su nombre
Pronto
3
@Soonts Entonces en "{}"lugar de {}debería solucionarlo.
user4642212
Ejecuté esto bajo el subsistema de Linux en Windows 10 y tuvo el efecto contrario. La mayoría de los permisos de archivo fueron eliminados.
Max Candocia
176

Puede usar chmod con la Xletra de modo (la X mayúscula) para establecer el indicador ejecutable solo para directorios.

En el siguiente ejemplo, el indicador ejecutable se borra y luego se establece 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 la bandera eXecutable parafoo
  • chmod +x foo- establecer la bandera eXecutable parafoo
  • chmod go+x foo- igual que el anterior, pero establezca la marca solo para usuarios de Grupo y Otros , no toque el permiso de Usuario (propietario)
  • chmod go+X foo - igual que el anterior, pero solo se aplica a directorios, no toque archivos
  • chmod -R go+X foo- igual que el anterior, pero haga esto Recursivamente para todos los subdirectorios defoo
Dmitry
fuente
80

Intente cambiar todas las transmisiones al mismo tiempo:

chmod -R +xr
choroba
fuente
Eso también otorgará permisos de ejecución en todos los no directorios.
Fred Foo
1
Si. Esto simplemente reemplaza el primer paso iterado. Todavía tienes que correr find -type f -exec chmod -x {} +después.
choroba
50

Para que el propietario pueda escribir todo, leer / ejecutar por el grupo y ejecutable mundial:

chmod -R 0755

Para hacer que todo esté abierto:

chmod -R 0777
Tim Jensen
fuente
12
Agregue la ubicación actual de la carpeta:chmod -R 0777 .
Danijel
18

Agregar permisos ejecutables, recursivamente , a todos los archivos (no carpetas) dentro de la carpeta actual con shextensión:

find . -name '*.sh' -type f | xargs chmod +x

* Observe la tubería ( |)

AlikElzin-kilaka
fuente
2

Dé 0777 a todos los archivos y directorios a partir de la ruta actual:

chmod -R 0777 ./

Anthony Vinay
fuente