chmod cambia los archivos pero no directorios
Pregunta
necesito utilizar chmod para cambiar todos los archivos recursivamente a 664. Me gustaría pasar por alto carpetas. Yo estaba pensando en hacer algo como esto
ls -lR | grep ^-r | chmod 664
Esto no funciona, estoy asumiendo porque no puedo tubería en chmod Alguien sabe de una manera fácil de hacer esto?
Gracias
Solución
Una respuesta find -exec
es buena pero adolece del defecto suelen ser irrelevantes que crea un subproceso independiente para cada archivo. Sin embargo, es perfectamente funcional y sólo un mal rendimiento cuando el número de archivos se pone realmente grande. Usando xargs
hará por lotes hasta los nombres de los archivos en grupos grandes antes de ejecutar un subproceso para que grupo de los archivos.
Sólo hay que tener cuidado de que, en el uso de xargs
, manejar adecuadamente los nombres de archivo con espacios incrustados, los saltos de línea u otros caracteres especiales en ellos.
Una solución que resuelve ambos problemas es (suponiendo que tiene una suficiente find
y xargs
aplicación decente):
find . -type f -print0 | xargs -0 chmod 644
El -print0
causa find
para terminar los nombres de archivo en su flujo de salida con un carácter NUL (en lugar de un espacio) y el -0
a xargs
lo deja saber que debe esperar que a medida que el formato de entrada.
Otros consejos
Otra manera de hacer esto es utilizar find ... -exec ...
de la siguiente manera:
find . -type f -exec chmod 644 {} \;
El problema es que el -exec
inicia un proceso chmod
para cada archivo. El enfoque xargs
evita esto, y es superior siempre y cuando tenga una versión de find
y xargs
que pueden hacer frente a los "espacios en los nombres de ruta" problema; ver la respuesta aceptada.
Y para que conste, utilizando back-garrapatas se va a romper si hay demasiados archivos para tener permisos, o la longitud acumulada de las rutas de acceso es demasiado grande.
Mis sucintas dos centavos ...
Linux:
$ chmod 644 `find -type f`
OSX:
$ chmod 644 `find . -type f`
Esto funciona para cambiar de forma recursiva todos los archivos contenidos en el directorio actual y todos sus subdirectorios. Si desea dirigirse a un directorio diferente, .
sustituto con la ruta correcta:
$ chmod 644 `find /home/my/special/folder -type f`
"encontrar type f -print |. Xargs chmod 444" SHAUD funciona, ¿no es así? Si no es así, encontrar. -print> myfile.sh y vi myfile.sh eliminación de los directorios (que no debe ser taaan muchos), y luego 1, $ s / ^ / chmod 444 / y sh myfile.sh.
con GNU encontrar
find /path -type f -exec chmod 644 {} +;