Je faisais un changement récursif en masse des permissions de certains files que j'avais migrés vers un système unix. Je les ai changés en ug + rw, mais j'ai trouvé que je ne pouvais pas traverser les sous-directorys. J'ai regardé la page de chmod
pour chmod
et je n'ai vu aucune explication pour exclure les directorys. J'ai donc googlé un peu et trouvé que les gens utilisaient find
pour modifier récursivement les permissions sur les directorys. Je l'ai fait et puis j'ai pu les examiner.
Mais il m'a semblé que je devrais être en mesure de faire cela find chmod
– pour modifier récursivement les files à lire / écrire, mais ne pas rendre les directorys invisibles. Ai-je fait cela de la bonne façon ou y a-t-il un moyen plus simple de le faire?
La meilleure solution devrait être
chmod -R ug=rwX,o=rX /path
où la majuscule X
signifie: set execute bit if
le file est un directory ou a déjà l'autorisation d'exécution pour certains users
(cité de la page de chmod
de chmod
).
Ou aussi, si vous voulez utiliser find
find /path \( -type f -exec chmod ug=rw,o=r {} + \) -o \ \( -type d -exec chmod ug=rwx,o=rx {} + \)
L'utilisation de la search est la bonne voie et la seule manière programmatique, bien qu'il y ait des variations:
find . -type f -exec chmod ug+rw {} + # "+" may not be on all systems
ou
find . -type f -print0 | xargs -r0 chmod ug+rw # similar to the -exec + functionality
ou le plus lent:
find . -type f -exec chmod ug+rw {} \; # in case xargs is not installed
Chacun de ceux-ci sélectionne un file (pas de directory, pas de lien symbolique) et applique la command chmod
dessus. Les deux premiers réduisent le nombre d'appels à chmod
en ajoutant le file à la fin d'une command line interne à chaque fois jusqu'à ce qu'un maximum soit atteint (souvent 10), puis appelle la command et commence à rebuild une nouvelle command. La dernière déclaration génère un nouveau process pour chaque file, donc il est less efficace.