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?
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é.
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:
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.
Une façon de le faire:
find backup -type f -exec chmod 0644 {} +
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).
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