changer récursivement l'autorisation de fichier mais pas les répertoires?


13

Je faisais un changement récursif de masse des autorisations de certains fichiers que j'avais migrés vers un système Unix. Je les ai changés en ug + rw, mais j'ai découvert que je ne pouvais pas parcourir les sous-répertoires. J'ai regardé la page de manuel chmodet je n'ai vu aucune explication pour exclure les répertoires, j'ai donc fait une petite recherche sur Google et j'ai constaté que les gens findmodifiaient récursivement les autorisations sur les répertoires pour `` exécuter '' pour l'utilisateur et le groupe. Je l'ai fait et ensuite j'ai pu les examiner.

Mais il me semblait que je devrais pouvoir faire cette recherche chmod- changer récursivement les fichiers en lecture / écriture mais pas rendre les répertoires intraversables. Ai-je fait cela de la bonne manière ou existe-t-il une manière plus simple de le faire?

Réponses:


12

La meilleure solution devrait être

chmod -R ug=rwX,o=rX /path

où le capital Xsignifie: définir le bit d'exécution si

le fichier est un répertoire ou a déjà l'autorisation d'exécution pour un utilisateur

(extrait de la chmodpage de manuel).

Ou aussi, si vous souhaitez utiliser find

find /path \( -type f -exec chmod ug=rw,o=r   {} + \) -o \
           \( -type d -exec chmod ug=rwx,o=rx {} + \)

J'ai utilisé la version grand ouvert pour tout le monde de cette commande pour mon disque dur USB: chmod -v -R ugo = rwX / path Merci!
The Dude

Évidemment, il n'y a aucun moyen sans utiliser findpour définir toutes les autorisations de fichiers sur 600 et toutes les autorisations de répertoire sur 700. (Je suis arrivé ici via mes googlings sur le sujet.) Si cela peut être fait avec une seule chmod -Rcommande, n'hésitez pas à me corriger.
Wildcard

@Wildcard: pas exactement, la commande chmod -R u=rwX,go= /pathfait presque ce que vous voulez: elle définit tous les répertoires sur 700 et tous les fichiers sur 600 ou 700, selon que le bit d'exécution est déjà défini ou non, et je pense que c'est la bonne chose à faire .
enzotib

1
@enzotib, oui, presque, mais pas tout à fait. Dans mon cas, je veux désactiver le bit d'exécution pour tous les fichiers (mais pas les répertoires bien sûr), qu'il s'agisse de scripts ou de binaires ou autre. La findcommande que vous avez écrite a donc été très utile en tant que modèle. :)
Wildcard

@Wildcard qu'en est-il de la suppression du bit d'exécution en premier, récursivement, puis en l'ajoutant uniquement aux répertoires à l'aide de la commande ci-dessus?
Michael

3

L'utilisation de find est la «bonne» manière, et la seule manière programmatique, bien qu'il existe des variantes:

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 d'eux sélectionne un fichier (pas de répertoire, pas de lien symbolique) et lui applique la chmodcommande. Les deux premiers réduisent le nombre d'appels à chmoden ajoutant le fichier à la fin d'une ligne de commande interne à chaque fois jusqu'à ce qu'un maximum soit atteint (souvent 10), puis appelle la commande et commence à reconstruire une nouvelle commande. La dernière instruction génère un nouveau processus pour chaque fichier, il est donc moins efficace.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.