Quiero establecer el permiso 755 en todos los archivos y subdirectorios en un directorio específico, pero quiero ejecutar chmod 755 solo para aquellos componentes que no tienen permiso 755.
find /main_directory/ -exec chmod 755 {} \;
Si el find
comando devuelve una lista larga, esto llevará mucho tiempo. Sé que puedo usar el comando stat para verificar el permiso de nivel de archivo Octal de cada componente y luego usar if-else para alternar el permiso de archivo, pero ¿hay algún enfoque de línea única que use find
y xargs
para verificar primero qué permiso tiene el archivo / directorio? , y luego use chmod
para cambiarlo a 755 si está configurado en otra cosa.
command-line
find
chmod
Kumarjit Ghosh
fuente
fuente
u+rw,go+r,go-w,ugo+X
: tenga en cuenta la capital.Respuestas:
Si desea cambiar los permisos
755
tanto en los archivos como en los directorios, no hay un beneficio real de usarfind
(al menos desde el punto de vista del rendimiento), y simplemente podría hacerloSi realmente desea usar
find
para evitar cambiar los permisos en cosas que ya tienen755
permisos (para evitar actualizar su marca de tiempo ctime), entonces también debe probar los permisos actuales en cada directorio y archivo:El
-exec ... {} +
va a recoger la mayor cantidad posible de nombres de ruta que pasa la! -perm 0755
prueba, y ejecutarchmod
en todos ellos a la vez.Por lo general, uno querría cambiar los permisos en archivos y directorios por separado, para que no todos los archivos sean ejecutables:
fuente
+
lugar de;
hacer una gran diferencia aquí.Como
find
obtuve la-exec ... +
sintaxis, no tiene mucho sentido usarlaxargs
, pero a medida que la solicita:fuente
-0
(en combinación con-print0
in find; que es la extensión GNU) puede ser bastante problemático en cuanto a seguridad si un atacante potencial puede crear nombres de archivo que incluyan espacios en blanco u otros caracteres especiales en ellos. Así que mejor quédate-exec
cuando puedasxargs
(solo use-exec
), y si lo usa, debe usar-print0
/-0
como dice Matija.