web-dev-qa-db-fra.com

Comment supprimer récursivement les autorisations d'exécution des fichiers sans toucher aux dossiers?

J'ai fait une sauvegarde sur un lecteur NTFS, et bien, cette sauvegarde s'est avérée vraiment nécessaire. Cependant, le lecteur NTFS a gâché les autorisations. Je voudrais les restaurer à la normale sans réparer manuellement chaque fichier.

Un problème est que tout à coup tous mes fichiers texte ont obtenu des autorisations d'exécution, ce qui est souvent faux. J'ai donc essayé:

Sudo chmod -R a-x folder\ with\ restored\ backup/

Mais c'est faux car il supprime également l'autorisation x des répertoires, ce qui les rend illisibles.

Quelle est la commande correcte dans ce cas?

48
gaazkam

Si vous êtes d'accord avec la définition des autorisations d'exécution pour tout le monde sur tous les dossiers:

chmod -R -x+X *

Le -x supprime les autorisations d'exécution pour tous
Le +X ajoutera des autorisations d'exécution pour tous, mais niquement pour les répertoires.

Voir ci-dessous pour une solution qui utilise find pour vraiment ne pas toucher les dossiers comme demandé.

74
Jak Gibb

Ok, j'ai relu les pages de manuel "chmod" pour Mac OS X, BSD et Linux, et j'ai fait quelques expériences. Voici ce que j'ai appris sur les modes symboliques. Cela peut devenir compliqué, mais cela vaut la peine d'être compris:

  • La forme générale est clause [ clause…] où:
  • clause: goa] [+ - =] [rwxXstugo]
  • [ugoa] ( who ) (spécifier plusieurs) signifie définir l'autorisation pour l'utilisateur, le groupe, l'autre ou tous. S'il n'est pas spécifié, la valeur par défaut est 'a', mais le mask est en vigueur.
  • [+ - =] ( action ) (spécifiez une) signifie:
    • + signifie ajouter les autorisations spécifiées aux autorisations déjà en vigueur
    • - signifie supprimer les autorisations spécifiées des autorisations déjà en vigueur
    • = signifie définir les autorisations sur les autorisations spécifiées, en effaçant toutes les autres
  • [rwxXstugo] ( permission ) (spécifiez plusieurs rwxXst OR one of ugo) définit les permissions pour l'utilisateur spécifié (s) comme suit:
    • r - lire
    • w - écrire
    • x - exécuter/rechercher
    • X - Exécuter/rechercher dans le répertoire siff OR tout bit d'exécution a déjà été défini.
    • s - suid ou sgid
    • t - collant
    • u - copier l'autorisation utilisateur
    • g - copier la permission du groupe
    • o - copier une autre autorisation

Ainsi, par exemple, a+x rendrait un fichier exécutable par tout le monde. a+X rendrait un fichier exécutable par tout le monde SI il avait été exécutable par n'importe qui.

a+x rendrait un répertoire consultable par tout le monde. a+X rendrait également un répertoire consultable par tout le monde.

La principale différence entre BSD et Linux est qu'avec BSD, la détermination est basée sur les autorisations du fichier == [- avant chmod a été exécuté. Sous Linux, la détermination est effectuée immédiatement avant l'exécution de la clause + X.

Donc, avec BSD, la combinaison a-x,a+X supprimerait l'autorisation d'exécution/recherche, puis rendrait un répertoire consultable par tout le monde, et rendrait un fichier exécutable par tout le monde si il avait été initialement exécutable par n'importe qui.

Avec Linux, a-x,a+X supprimerait l'autorisation d'exécution/recherche, puis rendrait un répertoire consultable par tout le monde, tout en laissant un fichier exécutable par personne.


Voici un exemple concret: sur une machine BSD: un répertoire, un fichier exécutable et un fichier non exécutable:

drwxr-x---  2 falk  staff  68 Jul 19 18:01 fee/
-rwxr-x---  1 falk  staff   0 Jul 19 18:01 fie*
-rw-r-----  1 falk  staff   0 Jul 19 18:01 foe

Notez que le répertoire et "fie" sont exécutables/consultables par l'utilisateur, mais pas par les autres.

Maintenant, nous exécutons chmod a-x,a+X *. La première clause supprimera le bit d'exécution/recherche de tous les utilisateurs pour tous les fichiers, mais la deuxième clause le rajoutera à la fois pour "frais" et "fie". "fee" car c'est un répertoire, et "fie" car il avait au moins un bit exécutable pour commencer.

drwxr-x--x  2 falk  staff  68 Jul 19 18:01 fee/
-rwxr-x--x  1 falk  staff   0 Jul 19 18:01 fie*
-rw-r-----  1 falk  staff   0 Jul 19 18:01 foe

J'ai eu le même résultat en exécutant chmod -x+X.

Conclusion: la solution de Jak Gibb fonctionnera sous Linux, mais pour BSD, vous devrez effectuer deux passes.

Je n'ai pas testé cela sur SVr4 ou d'autres variantes Unix.

16
Edward Falk

Une façon de le faire:

find backup -type f -exec chmod 0644 {} +
10
Satō Katsura
 find backup ! -type l ! -type d -exec chmod a-x {} +

Supprime l'autorisation d'exécution pour les fichiers qui ne sont pas de type répertoire (comme vous l'avez demandé) ni lien symbolique (les liens symboliques sont généralement toujours rwxrwxrwx et chmod affecterait _ la cible du lien symbolique sur eux).

Notez que:

 find backup -type f -exec chmod a-x {} +

ne changerait que l'autorisation des fichiers réguliers. Cela exclurait répertoires et liens symboliques, mais aussi périphériques, canaux nommés, sockets et éventuellement d'autres en fonction du système (bien que dans le cas du PO d'une sauvegarde d'un système de fichiers NTFS, il est peu probable qu'ils soient présents).

7
Stéphane Chazelas

Dans zsh, utilisez le qualificatif glob. pour ne faire correspondre que les fichiers normaux (sans les liens symboliques) et D pour faire correspondre les fichiers de points:

Sudo chmod a-x folder\ with\ restored\ backup/**/*(D.)

Si la ligne de commande est trop longue, vous pouvez utiliser zargs :

zargs -- folder\ with\ restored\ backup/**/*(D.) -- Sudo chmod a-x