Tengo un directorio principal que tiene varias aplicaciones dentro, cada una tiene sus propios bin
subdirectorios
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 bin
la 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 bin
profundidad/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 -R
en cada uno bin
, pero para encontrar una forma más limpia, quiero aplicarlo +x
solo en los archivos.
Respuesta1
Es necesario permitirlo x
en los directorios: enumerar un directorio (y así encontrar un archivo dentro) es lo que x
significa el privilegio en un directorio.
Dicho esto, usando
-exec chmod -R a+x {}/* \;
asignará x
solo el contenido de un directorio, no el directorio en sí.
Si desea atender bin
directorios 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
bin
los 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
find
llamadas: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
-print0
y todo eso).Desafortunadamente no puedes anidar directamente
find -exec
dentro de otrofind -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
-execdir
en lugar de-exec
para evitar el anidamiento {} problemático.