Chmod récursif: rw pour les fichiers, rwx pour les répertoires

28

Je veux chmodbeaucoup de fichiers et de répertoires. Comme l' xindique la liste des répertoires et exécuter pour les fichiers réguliers, je voudrais appliquer rwpour les fichiers et rwxpour les répertoires. Est-il possible d'utiliser uniquement la chmodcommande?

Si ce n'est pas le cas, quel est le moyen le plus pratique?

Faire un chmod -R 770n'est pas une possibilité car je ne veux pas que les fichiers normaux deviennent exécutables.

Effacé
la source
1
Voulez-vous vraiment une autorisation d'écriture publique sur les fichiers et les répertoires? Cela signifie que vous ne vous souciez pas de savoir qui encombre les fichiers?
Jonathan Leffler
Vrai. Je l'ai changé ci-dessus.
Supprimé

Réponses:

19

Je fais cela à l'occasion en utilisant une seule findcommande. Moche mais efficace.

find /p/a/t/h \( -type d -exec chmod 755 {} \; \) -o \( -type f -exec chmod 644 {} \; \)
baumgart
la source
"{}" Ne doit-il pas être cité, juste au cas où les chemins contiennent des espaces? Comme find . -type d -exec chmod -vc 755 "{}" \;(y compris -vcpour certains commentaires). (Et peut-être, juste pour clarifier, ajouter également les deux commandes autonomes à la réponse?)
Arjan
Non, {} n'a pas besoin d'être cité (je viens de tester pour en être absolument certain). Lorsque find insère {} dans la commande, elle est correctement échappée. Je n'ai pas recherché le fonctionnement interne de find, mais je suppose qu'il crée un tableau d'arguments à passer à exec (), et il strcpy () le nom de fichier dans le tableau. Lorsque chmod examine ses arguments, il apparaît correctement.
baumgart
37

Utilisez l'autorisation X, à partir de la page de manuel:

Les bits d'exécution / recherche si le fichier est un répertoire ou l'un des bits d'exécution / recherche sont définis dans le mode d'origine (non modifié). Les opérations avec le symbole permanent "X" n'ont de sens qu'en liaison avec le symbole op "+" et sont ignorées dans tous les autres cas.

Faites donc ce qui suit:

chmod -R a-x [directory]
chmod -R a+rwX [directory]

Cela supprime le bit d'exécution de tous les fichiers et répertoires, puis ajoute des privilèges de lecture et d'écriture à tout, et n'exécute des privilèges qu'aux répertoires. (Aucun fichier régulier n'a plus le bit d'exécution depuis la première étape.)

Ben S
la source
1
cela ne forcera pas le mode 666 sur les fichiers normaux. il n'efface pas le bit exécutable pour les fichiers normaux s'ils l'ont déjà défini.
Quack Quichote
Donc, dans ce cas, vous pourriez faire chmod -R a-x [directory]suivi par chmod -R a+rwX [directory]?
jwaddell
@jwaddel: Cela devrait fonctionner. Vous supprimez tous les bits d'exécution, quel que soit le type de fichier / répertoire, puis vous ajoutez uniquement les répertoires d'exécution et les fichiers normaux sur lesquels le bit d'exécution est déjà activé (ce qui n'est plus le cas).
Ben S
Une fois que je le fais a-x, le répertoire n'est pas accessible. En fait, chmod échoue avec l'autorisation refusée et ne supprimera pas le bit exécutable des fichiers dans le répertoire. Existe-t-il un moyen de le faire sans être root?
avakar
14

Vous pouvez également utiliser findavec xargs:

find . -type f -print0 | xargs -0 chmod 666
find . -type d -print0 | xargs -0 chmod 777

-typeprécise ; d irectory ou f ile.

John T
la source
1
Les xargs n'ont-ils pas de limitation de longueur? C'est BEAUCOUP de fichiers et de répertoires.
Supprimé
2
Je ferais d'abord des répertoires, puis des fichiers. Sinon, vous risquez de manquer un sous-arbre en raison d'un manque d'autorisation. En outre, vous devez vérifier si la liste est explorée avant ou après le chmod, sinon, comme ci-dessus. Et oui, je m'abstiendrais d'utiliser xargs.
Stefano Borini
1
xargsest assez intelligent pour couper de longues lignes de commande en plusieurs exécutions. Consultez votre page de manuel xargs et assurez-vous de vérifier xargs --show-limits.
Mike