Cambiar el propietario de los archivos de forma recursiva, pero no los directorios

14

Tengo un directorio que tiene ~ 50k directorios y ~ 1m de archivos.

Quiero cambiar el propietario (o permiso) de todos los archivos, pero no los directorios. Esto se debe a que estoy tratando de SCP archivos adicionales desde un servidor remoto, (~ 150k directorios y ~ 3.6m archivos).

El directorio que tengo es parte del directorio remoto, pero el scp falló ...

Si vuelvo a ejecutar SCP, comenzará de nuevo sobrescribiendo los archivos que ya copié del directorio remoto.

Marcus Brunsten
fuente

Respuestas:

20

Puede usarlo find, tiene la ventaja adicional de que ARG_MAXno se activará en el proceso. Desde el directorio padre:

find . -type f -exec chown newowner {} +

Para chmod:

find . -type f -exec chmod 644 {} +

-type flo hará findúnicamente archivos.

heemayl
fuente
1
Funciona muy bien! ¡Gracias! +1 tanto para chmod como para chown
Marcus Brunsten
2
¿Entonces findno se dispara ARG_MAX? Siempre pensé que lo habría hecho. Siempre aprendes algo :)
kos
5

Otra alternativa es usar xargs. Deberá usar la -print0opción con findy una -0opción correspondiente de xargs:

find . -type f -print0 | xargs -0 chown newuser:newgroup

De man find:

-print0

imprima el nombre completo del archivo en la salida estándar, seguido de un carácter nulo . Esto permite que los nombres de archivos que contienen nuevas líneas u otros tipos de espacios en blanco sean interpretados correctamente por los programas que procesan la salida de búsqueda. Esta opción corresponde a la opción -0 de xargs.

xargstambién lo manejará correctamente ARG_MAX.

AP
fuente
2
find..execmaneja nombres de archivos extraños ... ¿qué te hace pensar que no?
heemayl
1
@heemayl Ejecuté algunas pruebas y parece que tienes razón. Estoy corregido. Gracias por señalarlo, actualicé mi respuesta.
AP