Shell Script para revisar un directorio de forma recursiva y modificar según las condiciones del tipo de archivo

Shell Script para revisar un directorio de forma recursiva y modificar según las condiciones del tipo de archivo

¿Alguien puede indicarme un código o un tutorial para escribir un script de shell que pueda recorrer de forma recursiva toda una estructura de directorios (comenzando en el directorio de trabajo actual o con un argumento requerido de dónde comenzar) y que pueda:

  1. Determine si un elemento es un directorio y si lo es chmod 755, o...
  2. Determine si un elemento es un archivo (no un directorio) y chmod 644.

Estoy buscando compatibilidad con Ubuntu, Debian, basado en RHEL, etc., por lo que no etiqueto esto con ningún idioma en particular. Me gustaría esto en Bash, pero si tienes un script ZSH, también funcionará.

Respuesta1

Estoy acostumbrado a este comando de una línea (se repetirá comenzando en el directorio de trabajo actual)

find . -type d -exec chmod 0755 '{}' + -or -type f -exec chmod 0644 '{}' +

Explicación:

find .                    # starting in curdir find   
-type d                   # any directory
-exec chmod 0755 '{}'     # and chmod it to 755
+                         # (variant of -exec look find man page)
-or                       # or
-type f                   # any file
-exec chmod 0644 '{}'     # and chmod it to 644
+                         # (as above)

Respuesta2

La respuesta sencilla:

chmod -R a+rX .

+X(tenga en cuenta la X mayúscula) significa otorgar permiso de ejecución si el permiso de ejecución ya estaba presente para algún usuario. Si tiene un árbol de directorios que tiene los permisos adecuados para el propietario y desea que todos puedan acceder a él, este es el comando correcto a utilizar. No sólo hace que los directorios sean ejecutables en todo el mundo, sino también los archivos ejecutables.

Si también desea restablecer los permisos de escritura solo para el propietario y borrar cualquier bit setuid/setgid, hágalo

chmod -R a-ws,u+w,a+rX .

La obligatoria zsh de dos líneas, si no desea que ningún archivo sea ejecutable:

chmod 755 **/*(/)
chmod 644 **/*(.)

información relacionada