Esta es una pregunta más general sobre 'chmoding' recursivamente.
Tengo este script que en algún momento necesita cambiar los permisos de forma recursiva en una carpeta que tiene unos cientos de miles de archivos. Todos los días se agregan nuevos archivos a esa carpeta, pero los que ya están allí tienen los permisos ya establecidos y no cambian.
Mi pregunta es ... cuando llamo
chmod 775. -R
¿intenta establecer el permiso para los archivos que ya tienen establecidos los permisos correctos, o solo para los archivos nuevos que no tienen los permisos correctos?
Parece que siempre lleva años superar este comando en el script, a pesar de que los archivos 'nuevos' son solo unos pocos miles y deberían hacer sus permisos con bastante rapidez.
He buscado chmod en la página de manual, pero no parece mencionar nada en este caso.
Si chmod no comprueba los permisos de antemano, ¿debería comenzar a buscar la combinación de 'find' con 'chmod'?
fuente
Respuestas:
chmod
podría o no cambiar los permisos de los archivos que ya están configurados a lo que desea, pero si no, aún tendría que verificarlos para ver cuáles son sus permisos actuales [0]. Con cientos de miles de archivos, no creo que importe de ninguna manera; Es muy probable que las herramientasstat
empleen el tiempo en cada archivo.Puede intentar usar
find
para buscar archivos más nuevos que la última ejecución o los archivos que debenchmod
ejecutarse, pero no creo que vaya a mejorar mucho la velocidad.Si es posible para su secuencia de comandos, es posible que primero pueda colocar los nuevos archivos en un directorio separado, como un área de "retención". Luego puede
chmod
ESO directorio (que solo tiene archivos nuevos) ymv
agregarlos al resto. Eso debería ser sustancialmente más rápido, pero desafortunadamente no funcionará para todas las aplicaciones.[0] Incluso si intenta establecer el permiso de los archivos que no necesitan ningún cambio, el sistema de archivos subyacente probablemente no hará nada con la solicitud, porque es innecesario.
fuente
encontrar / optimización chmod
Ambos
find
ychmod
tengo que leerProbablemente obtenga una mejora en el rendimiento al leer primero todas las entradas y luego todos los inodes (en un disco giratorio) porque el cabezal del disco no se mueve entre el directorio y los inodes). Como
chmod
es estúpido (como explica una de las otras respuestas), solo se debe llamarfind
. Pero incluso entonces, puede ser útil leer todos los inodos antes de que se escriba el primero (suponiendo que tenga suficiente RAM libre para el caché del disco). Sugiero esto:La buena solución: ACL
La buena solución puede ser completamente diferente: si los archivos se crean en este directorio (y no se mueven de otro lugar), las ACL pueden hacer el trabajo sobre la marcha. Solo tiene que establecer las ACL predeterminadas en el directorio principal.
Se pueden lograr mejoras adicionales mediante las optimizaciones del sistema de archivos. Si es ext3 / ext4, puede ejecutar
e2fsck -D
de vez en cuando. Tal vez sea útil colocar este directorio en un volumen separado. Puede probar diferentes sistemas de archivos o configuraciones del sistema de archivos (por ejemplo, diferentes tamaños de inodo).fuente
find
solución casi duplicó mi tiempo,chmod
dentro de un contenedor acoplable.Suponiendo que el uso de
chmod
Del paquete GNU coreutils en Ubuntu 12.10.chmod 775 . -R
ejecuta lafchmodat
llamada del sistema para cada archivo que encuentra, independientemente de si los permisos deben cambiarse o no. Confirmé esto inspeccionando el código y usandostrace chmod 775 . -R
(fragmento a continuación) para enumerar el comportamiento real.Hay un par de desventajas de ejecutar
fchmodat
en cada archivofind
/xargs
/chmod
mencionado por otros probablemente será más rápido al cambiar solo los archivos que deben cambiarse.fchmodat
cambia la modificación del estado del archivo (ctime) de cada archivo. Esto hará que cada archivo / inodo cambie cada vez y probablemente causará un exceso de escritura en el disco. Es posible utilizar las opciones de montaje para detener estas escrituras en exceso.Un experimento simple muestra los cambios de ctime que ocurren para
chmod
Pero esto no cambia durante
find
/xargs
/chmod
unos minutos más tardeSiempre tendería a usar la versión
find
/xargs
/chmod
porque find brinda más control sobre la selección de cosas.fuente
La [fuente] (1) muestra que
chmod(1)
siempre intenta establecer el modo y luego vuelve a verificar con [fstatat (2)] (2).Los archivos se procesan a través de [fts (3)] (3), que tiene que 'stat' todos los objetos del sistema de archivos atravesados de antemano para construir su árbol de datos.
Unixlore presenta un [buen artículo] (4) donde se
chmod(1)
mide el tiempo contra unfind
/xargs
enfoque: este último gana por magnitudes.Aquí la línea de comando adaptada a la pregunta original:
Dos razones:
El recorrido del sistema de archivos se desacopla de las operaciones en los archivos a través de la tubería entre los dos procesos, que incluso pueden ejecutarse en diferentes núcleos.
fts(3)
la operación se minimiza porquexargs(1)
'aplana' el árbol de directorios.Entonces sí: definitivamente deberías usar
find
/xargs
. para una solución simpleOtras opciones:
Juegue con la [umask] (5) y el código fuente del proceso (s) escribiendo los nuevos archivos.
Si está utilizando Linux, es probable que su sistema haya habilitado el
inotify
subsistema del núcleo. En este caso, puede crear una secuencia de comandos de una solución eficiente a través de [inotifywait (1)] (6).Nota al margen: a menos que desee ejecutar permisos en sus archivos, sugeriría modificar la invocación de la siguiente manera:
Nota para los editores: no se me permite agregar más de dos enlaces a la publicación, ni comentar en otras publicaciones. Dejo las URL aquí y espero que algún usuario de corazón abierto con suficiente reputación los vuelva a incluir en el texto y elimine este párrafo.
Comente sobre cebar el caché del disco con
find . -printf ""
:Esto podría acelerar la ejecución de las siguientes
chmod
operaciones, sin embargo, depende de la memoria disponible y la carga de E / S. Entonces podría funcionar, o no. El desacoplamiento transversal (find
) y lachmod
operación ya proporcionan almacenamiento en caché, por lo que cebar el caché puede ser superfluo.fuente
¿Ha considerado cambiar los procesos que crean el archivo para que se creen con el modo 0775? Observe el valor de umask en el entorno: 0002 puede ayudar.
fuente