2009-07-22 10 views
53

Necesito usar chmod para cambiar todos los archivos recursivamente a 664. Me gustaría omitir las carpetas. Yo estaba pensando en hacer algo como estocambiando chmod para archivos pero no directorios

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

+1

Esto se debe pedir en ServerFault – MoshiBin

+0

chmod realmente debe ser capaz de diferenciar entre los archivos, enlaces y carpetas en su propio. – Xeoncross

Respuesta

82

A find -exec respuesta es buena, pero adolece de la deficiencia generalmente irrelevante que crea un subproceso separado para cada archivo. Sin embargo, es perfectamente funcional y solo funcionará mal cuando la cantidad de archivos sea realmente grande. El uso de xargs combinará los nombres de los archivos en grupos grandes antes de ejecutar un subproceso para ese grupo de archivos.

Solo debe tener cuidado de que, al usar xargs, maneje adecuadamente los nombres de archivo con espacios incrustados, saltos de línea u otros caracteres especiales en ellos.

Una solución que resuelve estos dos problemas es (suponiendo que tiene una bastante decente find y xargs aplicación):

find . -type f -print0 | xargs -0 chmod 644 

Los -print0 causas find para poner fin a los nombres de archivo en su flujo de salida con un carácter NUL (en lugar de un espacio) y el -0 a xargs le informa que debe esperar que como formato de entrada.

+0

Esto es genial para GNU find pero desafortunadamente -print0 y xargs -0 no son estándar, y no funcionan, p. en Solaris. Entonces, en ese caso, use una de las otras soluciones. – mark4o

+1

Puedo confirmar que este método funciona en Mac OSX (10.9 al menos). –

+0

@ mark4o, no está limitado a usar las versiones braindead que vienen con Solaris. Una gran ventaja de FOSS es que puede llevarlo a un sistema operativo lo suficientemente cercano (UNIXy). Frecuentemente hice eso para AIX por versión-5L. – paxdiablo

27

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 lo evita, y es superior siempre que tenga una versión de find y xargs que pueda hacer frente al problema de "espacios en rutas"; ver la respuesta aceptada

Y para que conste, el uso de retrocesos se va a romper si hay demasiados archivos para ser considerados, o la longitud agregada de los nombres de las rutas es demasiado grande.

+1

¿cuál es la diferencia entre \ y '+'? –

+2

@HowChen - Lee 'hombre encontrar'. –

+2

En realidad ... es la diferencia entre ';' y '+;'. La barra diagonal inversa es el escape de shell. –

2

con GNU encontrar

find /path -type f -exec chmod 644 {} +;

13

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 orientar un directorio diferente, sustituya . con la ruta correcta:

$ chmod 644 `find /home/my/special/folder -type f` 
+0

¿cómo se especifica qué directorio? –

+1

Mi respuesta original cubría lo que el OP había preguntado: cambiar recursivamente todos los archivos en el directorio actual. Vea mi edición sobre cómo aplicar esto a cualquier directorio, no solo el actual. –

+1

Gracias por la solución más simple y más corta – asherrard

Cuestiones relacionadas