Conceder permiso de ejecución sólo en archivos en los subdirectorios "bin"

Conceder permiso de ejecución sólo en archivos en los subdirectorios "bin"

Tengo un directorio principal que tiene varias aplicaciones dentro, cada una tiene sus propios binsubdirectorios

parent
--app1
  --bin
  --(maybe some other bins on even lower level)
--app2
  --bin
...

Lo que quiero hacer es agregar un permiso ejecutable en los archivos dentro de binla carpeta, pero no en ella.

Sin embargo, la estructura anterior no es regular (por lo que no puedo usar un bucle para predecir que hay una binprofundidad/nivel específico).

Hasta ahora lo que tengo es esto:

find /parent -type d -iname "bin" -exec chmod -R a+x {} \;

Sé que no hay ningún daño en hacerlo chmod -Ren cada uno bin, pero para encontrar una forma más limpia, quiero aplicarlo +xsolo en los archivos.

Respuesta1

Es necesario permitirlo xen los directorios: enumerar un directorio (y así encontrar un archivo dentro) es lo que xsignifica el privilegio en un directorio.

Dicho esto, usando

-exec chmod -R a+x {}/* \;

asignará xsolo el contenido de un directorio, no el directorio en sí.

Si desea atender bindirectorios anidados, use algo como

while read F; do \
  test -f "$F" || continue \
  test $(basename $(dirname "$F")) == "bin" || continue \
  chmod a+x "$F" \
done < find /path/to/base -type f

Respuesta2

Hay varios enfoques:

  • Como mencionó Eugen, +x en los directorios es normal; incluso es necesario para acceder a los contenidos. Si los scripts van a ser ejecutables en todo el mundo, entonces tiene sentido continuar con el método actual y hacer que los directorios también sean transitables en todo el mundo.

  • Puede confiar en los globos extendidos de bash para recopilar todos binlos directorios en cualquier profundidad:

    shopt -s globstar; find **/bin/ -type f -exec chmod a+x {} \;
    

    Lo mismo pero sin verificación de tipo:

    shopt -s globstar; chmod -R a+x **/bin/
    
  • Utilice múltiples findllamadas:

    find . -type d -name bin | while read -r path; do
        find "$path/" -type f -exec chmod a+x {} \;
    done
    

    (Esto supone que sus nombres de archivos no tienen saltos de línea; si los tienen, debería preocuparse, y debería ajustar el ejemplo para usarlo -print0y todo eso).

  • Desafortunadamente no puedes anidar directamente find -execdentro de otro find -exec, pero puedes llamar a un script que posteriormente llame a find -exec:

    find . -type d -name bin -execdir sh -c "find . -type f -exec chmod a+x {} \;" \;
    

    Esto se utiliza -execdiren lugar de -execpara evitar el anidamiento {} problemático.

información relacionada