CHMOD: aplicación de diferentes permisos para archivos frente a directorios

9

He estado tratando de limpiar los permisos en algunas cajas y he estado rastreando al hombre chmod, así como toda la documentación de Internet que manejo sin suerte, así que aquí vamos.

Básicamente, tengo un directorio con muchos subdirectorios y archivos, y me gustaría establecer los siguientes permisos:

Para directorios: 770 (u + rwx, g + rwx, o-rwx)

Para archivos: 660 (U + rw, g + rw, ax, o-rw)

Me gustaría intentar hacer esto con un solo chmod recursivo si es posible, para evitar recurrir a través de cada directorio y establecer permisos de archivo por archivo.

Me imagino que tiene que haber una manera de hacer esto sin escribir un script propio, pero no he podido encontrar nada.

¡Aprecio tu ayuda!

Skone
fuente

Respuestas:

10

Encuentro útil un script ya que a menudo es útil cambiar los permisos de archivo y directorio de una sola vez, y a menudo están vinculados. 770 y 660 para directorios compartidos en un servidor de archivos, 755/644 para directorios de servidores web, etc. Mantengo un script con el modo más comúnmente usado para ese tipo de servidor en el bin de la raíz / y solo hago la búsqueda manualmente cuando es común el modo no aplica.

#!/bin/sh
# syntax: setperm.s destdir
#
if [ -z $1 ] ; then echo "Requires single argument: <directoryname>" ; exit 1 ;                                       fi

destdir=$1

dirmode=0770
filemode=0660

YN=no

printf "\nThis will RECURSIVELY change the permissions for this entire branch:\n                                      "
printf "\t$destdir\n"
printf "\tDirectories chmod = $dirmode\tFiles chmod = $filemode\n"
printf "Are you sure want to do this [$YN]? "

read YN

case $YN in
        [yY]|[yY][eE][sS])
        # change permissions on files and directories.
        find $destdir -type f -print0 | xargs -0 chmod $filemode $i
        find $destdir -type d -print0 | xargs -0 chmod $dirmode $ii ;;

        *) echo "\nBetter safe than sorry I always say.\n" ;;
esac
iPaulo
fuente
¡Guauu! Esto es exactamente lo que estaba buscando. ¡Muchas gracias!
Skone
Hola iPaulo, ¿puedes explicar por casualidad el "$ ii" en la línea "find $ destdir -type d -print0 | xargs -0 chmod $ dirmode $ ii ;;". No estoy seguro de entender por qué no es solo "find $ destdir -type d -print0 | xargs -0 chmod $ dirmode $ i ;;" ¡Gracias!
Skone
20

No hay necesidad de guiones.

// Directorios:

find . -type d -exec chmod XXX {} \;

// Archivos:

find . -type f -exec chmod XXX {} \;
Soleado
fuente
17

En su caso, puede que no tenga que ser tan complicado como lo han hecho otros (aunque findes una buena herramienta para este tipo de cosas en general). La diferencia entre los modos es el bit de ejecución. Si es el caso de que ningún archivo ya tenga el bit de ejecución establecido, puede hacerlo en una sola invocación chmod, tal como lo solicitó.

chmod -R u=rwX,g=rwX,o= FILE...

La clave aquí es la capital X, que la página del manual explica como

ejecutar / buscar solo si el archivo es un directorio o ya tiene permiso de ejecución para algún usuario.

Por lo tanto, si sus archivos aún no tienen el bit de ejecución establecido, solo se establecerá para los directorios.

Mikael Auno
fuente
Esto es genial, pero mucho más que escribir 777. ¿Hay una abreviatura para -X?
Elliott B
6

Descubrí que al menos para mi caso de uso, usar rsyncpara copiar el directorio en sí mismo era mucho más rápido que usar chmoddirectamente con una lista de archivos find.

rsync -rpt --chmod=D770,F660 . .

Si desea agregar un chowna la misma operación, también rsyncpuede hacerlo con la --chown=user:groupopción.

Matthew Bush
fuente
Whoah, esto en realidad es mucho más rápido que chmod -R.
Epeli
Mucho más rápido que chmod. ¿Hay alguna desventaja al usar rsync de esta manera? Lo he estado haciendo mucho y todo parece estar bien.
Slothbear
1

Limpio y simple:

chmod 660 $(find . -type f)
chmod 770 $(find . -type d)
tomashin
fuente
Enfoque muy elegante.
user5336
3
quizás, pero tenga en cuenta que esto solo funciona si los archivos no tienen espacios en ellos. Un enfoque más "seguro" esfind ... -exec chmod ... {} \;
isaaclw