Tengo un directorio/some/dir que contiene millones de archivos y directorios. Necesito eliminar el bit X de todos los archivos, pero no de los directorios.
Las siguientes obras:
find /some/dir -type f -chmod -x {} \;
Pero creo que genera un proceso "chmod" para cada archivo. Eso puede explicar por qué funciona durante tanto tiempo.
¿Hay alguna manera de hacer esto de una manera más eficiente?
Respuesta1
Además xargs
, como mencionaba Ljm Dullaart, puedes usar:
find /some/dir -type f -exec chmod -x {} +
Como truco de depuración, puedes ver el comando generado con:
find /some/dir -type f -exec echo chmod -x {} +
Desde la página de manual deencontrar(1)dominio:
-exec command {} +
Esta variante de la-exec
acción ejecuta el comando especificado en los archivos seleccionados, pero la línea de comando se crea agregando cada nombre de archivo seleccionado al final; el número total de invocaciones del comando será mucho menor que el número de archivos coincidentes. La línea de comando está construida de manera muy similar a como xargs construye sus líneas de comando. Sólo se permite una instancia de{}
dentro del comando y debe aparecer al final, inmediatamente antes de+
; es necesario escaparlo (con un\
) o citarlo para protegerlo de la interpretación del shell. El comando se ejecuta en el directorio de inicio. Si cualquier invocación con el+
formulario devuelve un valor distinto de cero como estado de salida, entonces buscar devuelve un estado de salida distinto de cero. Si find encuentra un error, esto a veces puede provocar una salida inmediata, por lo que es posible que algunos comandos pendientes no se ejecuten en absoluto. Por este motivo,-exec my-command ... {} + -quit
es posible que my-command no se ejecute realmente. Esta variante de-exec
siempre devuelve verdadero.
Respuesta2
Úselo xargs
para limitar el desove:
find /path/to/base/dir -type f -print0 | xargs -0 chmod -x