changer récursivement l'autorisation de file mais pas les directorys?

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.