Pregunta Cómo recursivamente chmod todos los directorios, excepto los archivos?


¿Cómo chmod 755 todos los directorios pero ningún archivo (recursivamente)?

Inversamente, ¿cómo chmod solo archivos (recursivamente) pero no directorio?


517


origen


Relacionado: Cambie todos los permisos de archivos y carpetas de un directorio a 644/755en SO - kenorb


Respuestas:


Para dar recursivamente directorios leer y ejecutar privilegios:

find /path/to/base/dir -type d -exec chmod 755 {} +

Para dar recursivamente archivos leer privilegios:

find /path/to/base/dir -type f -exec chmod 644 {} +

O bien, si hay muchos objetos para procesar:

chmod 755 $(find /path/to/base/dir -type d)
chmod 644 $(find /path/to/base/dir -type f)

O, para reducir chmod desove:

find /path/to/base/dir -type d -print0 | xargs -0 chmod 755 
find /path/to/base/dir -type f -print0 | xargs -0 chmod 644

720



Los dos primeros ejemplos fallan en directorios con demasiados archivos: -bash: /bin/chmod: Argument list too long. El último comando funciona con muchos archivos, pero cuando se usa sudo uno debe tener cuidado de ponerlo antes de xargs en lugar de chmod: find /path/to/base/dir -type d -print0 | sudo xargs -0 chmod 755 - Agargara
También para tener en cuenta, estos comandos son inclusivo de la base dir. Entonces en el ejemplo de arriba, dir también se establecerá en 755. - CenterOrbit
chmod ... $(find /path/to/base/dir -type ...) falla para nombres de archivos con espacios en el nombre. - Dan Dascalescu
Creo que la versión más correcta (pero no la más rápida) con respecto a espacios y símbolos en nombres de archivos y cantidad de archivos es find /path/to/base/dir -type d -exec chmod 755 {} \; (find /path/to/base/dir -type f -exec chmod 644 {} \;) - Peter K


Una razón común para este tipo de cosas es establecer directorios en 755 pero archivos en 644. En este caso hay una manera un poco más rápida que la de Nik find ejemplo:

chmod -R u+rwX,go+rX,go-w /path

Sentido:

  • -R = recursivamente;
  • u+rwX = Los usuarios pueden leer, escribir y ejecutar;
  • go+rX = grupo y otros pueden leer y ejecutar;
  • go-w = grupo y otros no pueden escribir

Lo importante a tener en cuenta aquí es que mayúsculas X actúa de manera diferente a minúscula x. En el manual podemos leer:

Los bits de ejecución / búsqueda si el archivo es un directorio o cualquiera de los bits de ejecución / búsqueda se configuran en el modo original (no modificado).

En otras palabras, chmod u + X en un archivo no establecerá el bit de ejecución; y g + X solo lo configurará si ya está configurado para el usuario.


261



-R = recursivamente; u + rwX = los usuarios pueden leer, escribir y ejecutar; go + rX = group y otros pueden leer y ejecutar; go-w = group y otros no pueden escribir - släcker
Este patrón no solucionará la situación cuando alguien lo haya hecho chmod -R 777 ya que el +X La opción no restablecerá los bits de ejecución existentes en los archivos. El uso de -x restablecerá los directorios e impedirá que entren en ellos. - Andrew Vit
@ ring0: No tengo la intención de responder la pregunta literalmente como se plantea, nik ya lo ha hecho perfectamente bien. Estoy señalando una solución más barata para el caso más común. Y sí, obtienes diferentes permisos para archivos y directorios con X, como se explica en los comentarios. - bobince
go+rX,go-w -> go=rX no es así? - Pierre de LESPINAY
También puedes usar chmod u-x,u+X en combinación, etc., para eliminar bits de ejecución para archivos, pero agréguelos para directorios. - w0rp


Si desea asegurarse de que los archivos están configurados en 644 y hay archivos en la ruta que tienen el indicador de ejecución, primero deberá quitar el indicador de ejecución. + X no elimina el indicador de ejecución de los archivos que ya lo tienen.

Ejemplo:

chmod -R ugo-x,u+rwX,go+rX,go-w path

Actualización: parece fallar porque el primer cambio (ugo-x) hace que el directorio no sea ejecutable, por lo que no se modifican todos los archivos que se encuentran debajo.


12



Esto funciona para mí, y no veo por qué no lo haría. (Claro, si lo hiciste solo chmod -R ugo-x path, Eso podría ser un problema. Pero el comando completo hará chmod u+rwX en cada directorio antes de que intente descender a él.) Sin embargo, creo que chmod R u=rw,go=r,a+X path es suficiente, y es más corto. - Scott
Encontré que esto funcionó correctamente; no hubo problemas al ingresar directorios - Someone Somewhere


Decidí escribir un pequeño guión para esto yo mismo.

Script chmod recursivo para dirs y / o archivos - Gist

Básicamente hace el chmod recursivo pero también proporciona un poco de flexibilidad para las opciones de línea de comando (establece permisos de directorio y / o archivo, o excluye ambos restablece automáticamente todo a 755-644). También verifica algunos escenarios de error.

También escribí sobre eso en mi blog.


4





Para dar recursivamente directorios leer y ejecutar privilegios:

find /path/to/base/dir -type d -exec chmod 755 {} \;

Para dar recursivamente archivos leer privilegios:

find /path/to/base/dir -type f -exec chmod 644 {} \;

Mejor tarde que nunca, déjame actualizar la respuesta de Nik por el lado de la corrección. Mi solución es más lenta, pero funciona con cualquier cantidad de archivos, con cualquier símbolo en los nombres de archivo, y puede ejecutarlo normalmente con sudo (pero tenga en cuenta que podría descubrir diferentes archivos con sudo).


3





Prueba este script de python; no requiere desove de procesos y solo hace dos llamadas por archivo. Además de una implementación en C, probablemente sea la manera más rápida de hacerlo (lo necesitaba para arreglar un sistema de archivos de 15 millones de archivos, todos ellos configurados en 777)

#!/usr/bin/python3
import os
for par, dirs, files in os.walk('.'):
    for d in dirs:
        os.chmod(par + '/' + d, 0o755)
    for f in files:
        os.chmod(par + '/' + f, 0o644)

En mi caso, se requirió una prueba / captura alrededor del último chmod, ya que falló la modificación de algunos archivos especiales.


0





También puedes usar tree:

tree -faid /your_directory | xargs -L1 -I{} sudo chmod +x {}

-1





Podría usar el siguiente script bash como ejemplo. Asegúrese de darle permisos ejecutables (755). Simplemente use ./autochmod.sh para el directorio actual, o ./autochmod.sh <dir> para especificar uno diferente.

#!/bin/bash

if [ -e $1 ]; then
    if [ -d $1 ];then
        dir=$1
    else
        echo "No such directory: $1"
        exit
    fi
else
    dir="./"
fi

for f in $(ls -l $dir | awk '{print $8}'); do
    if [ -d $f ];then
        chmod 755 $f
    else
        chmod 644 $f
    fi
done

-2



¡Guauu! ¡Tantos problemas! (1) Si $1 no es nulo, pero no es el nombre de un directorio (por ejemplo, es un error tipográfico), luego dir se pone a . sin mensaje (2) $1 debiera ser "$1" y $dir debiera ser "$dir". (3) No necesitas decir "./"; "." está bien (y, estrictamente hablando, no necesita citas aquí). (4) Esta no es una solución recursiva. (5) En mi sistema, ls -l … | awk '{ print $8 }' obtiene los tiempos de modificación de los archivos. Necesitas { print $9 } Llegar la primera palabra de el nombre del archivo E incluso entonces, (6) esto no maneja nombres de archivos con espacios en blanco. ... - Scott
... Y, por último pero no menos importante (∞) si este script está en el directorio actual, lo hará chmod  sí mismo a 644, haciéndose así no ejecutable! - Scott