Question Comment chmoder récursivement tous les répertoires à l'exception des fichiers?


Comment chmod 755 tous les répertoires, mais pas de fichier (récursivement)?

Inversement, comment chmoder uniquement les fichiers (récursivement) mais pas de répertoire?


517
2018-01-06 01:56


origine


En relation: Changez toutes les autorisations de fichiers et de dossiers d'un répertoire sur 644/755chez SO - kenorb


Réponses:


Donner récursivement les répertoires lecture et exécution des privilèges:

find /path/to/base/dir -type d -exec chmod 755 {} +

Donner récursivement des dossiers privilèges de lecture:

find /path/to/base/dir -type f -exec chmod 644 {} +

Ou, s'il y a beaucoup d'objets à traiter:

chmod 755 $(find /path/to/base/dir -type d)
chmod 644 $(find /path/to/base/dir -type f)

Ou réduire chmod le frai:

find /path/to/base/dir -type d -print0 | xargs -0 chmod 755 
find /path/to/base/dir -type f -print0 | xargs -0 chmod 644

720
2018-01-06 01:58



Les deux premiers exemples échouent pour les répertoires contenant trop de fichiers: -bash: /bin/chmod: Argument list too long. La dernière commande fonctionne avec de nombreux fichiers, mais en utilisant sudo il faut faire attention à le mettre avant xargs au lieu de chmod: find /path/to/base/dir -type d -print0 | sudo xargs -0 chmod 755 - Agargara
A noter également que ces commandes sont compris du répertoire de base Donc, dans l'exemple ci-dessus, dir sera également réglé sur 755. - CenterOrbit
chmod ... $(find /path/to/base/dir -type ...) échoue pour les noms de fichiers avec des espaces dans le nom. - Dan Dascalescu
Je pense que la version la plus correcte (mais pas la plus rapide) en ce qui concerne les espaces et les symboles dans les noms de fichiers et le nombre de fichiers est find /path/to/base/dir -type d -exec chmod 755 {} \; (find /path/to/base/dir -type f -exec chmod 644 {} \;). - Peter K


Une des raisons communes pour ce genre de chose est de définir des répertoires sur 755, mais les fichiers sur 644. Dans ce cas, il existe un moyen légèrement plus rapide que les fichiers nik. find Exemple:

chmod -R u+rwX,go+rX,go-w /path

Sens:

  • -R = récursivement
  • u+rwX = Les utilisateurs peuvent lire, écrire et exécuter;
  • go+rX = group et les autres peuvent lire et exécuter;
  • go-w = groupe et les autres ne peuvent pas écrire

La chose importante à noter ici est que les majuscules X agit différemment en minuscule x. En manuel on peut lire:

Les bits d'exécution / de recherche si le fichier est un répertoire ou l'un des bits d'exécution / de recherche sont définis dans le mode original (non modifié).

En d'autres termes, chmod u + X sur un fichier ne définira pas le bit d'exécution; et g + X ne le définira que s'il est déjà défini pour l'utilisateur.


261
2018-01-06 03:22



-R = récursivement; u + rwX = Les utilisateurs peuvent lire, écrire et exécuter; go + rX = group et d'autres peuvent lire et exécuter; go-w = groupe et les autres ne peuvent pas écrire - släcker
Ce modèle ne résoudra pas la situation quand quelqu'un a fait chmod -R 777 depuis le +X L'option ne réinitialisera pas les bits d'exécution existants sur les fichiers. L'utilisation de -x réinitialisera les répertoires et empêchera leur descente. - Andrew Vit
@ ring0: Je n'ai pas l'intention de répondre littéralement à la question telle que posée - nik l'a déjà très bien fait. Je montre une solution moins coûteuse pour le cas le plus courant. Et oui, vous obtenez des autorisations différentes pour les fichiers et les répertoires avec X, comme expliqué dans les commentaires. - bobince
go+rX,go-w -> go=rX n'est-ce pas? - Pierre de LESPINAY
Vous pouvez aussi utiliser chmod u-x,u+X en combinaison, etc., pour supprimer les bits d'exécution des fichiers, mais les ajouter pour les répertoires. - w0rp


Si vous voulez vous assurer que les fichiers sont définis sur 644 et qu'il y a des fichiers dans le chemin avec l'indicateur d'exécution, vous devrez d'abord supprimer le drapeau d'exécution. + X ne supprime pas le drapeau d’exécution des fichiers qui l’ont déjà.

Exemple:

chmod -R ugo-x,u+rwX,go+rX,go-w path

Mise à jour: cela semble échouer car le premier changement (ugo-x) rend le répertoire inexécutable, donc tous les fichiers situés en dessous ne sont pas modifiés.


12
2018-01-22 16:14



Cela fonctionne pour moi, et je ne vois pas pourquoi. (Bien sûr, si vous avez juste fait chmod -R ugo-x path, cela pourrait être un problème. Mais la commande complète fera le chmod u+rwX sur chaque répertoire avant d'essayer d'y descendre.) Cependant, je crois que chmod R u=rw,go=r,a+X path est suffisant - et il est plus court. - Scott
J'ai trouvé que cela fonctionnait correctement; il n'y avait pas de problèmes avec la saisie des répertoires - Someone Somewhere


J'ai décidé d'écrire un petit script pour cela moi-même.

Script chmod récursif pour dirs et / ou fichiers - Gist

Il fait essentiellement le chmod récursif mais offre également un peu de flexibilité pour les options de ligne de commande (définit les autorisations de répertoire et / ou de fichier, ou exclut les deux, il réinitialise automatiquement tout à 755-644). Il vérifie également quelques scénarios d'erreur.

J'ai aussi écrit à ce sujet sur mon blog.


4
2017-09-18 14:00





Donner récursivement les répertoires lecture et exécution des privilèges:

find /path/to/base/dir -type d -exec chmod 755 {} \;

Donner récursivement des dossiers privilèges de lecture:

find /path/to/base/dir -type f -exec chmod 644 {} \;

Mieux vaut tard que jamais me laisser améliorer la réponse de nik du côté de la correction. Ma solution est plus lente, mais elle fonctionne avec n'importe quel nombre de fichiers, avec des symboles dans les noms de fichiers, et vous pouvez l'exécuter normalement avec sudo (mais attention, il pourrait découvrir différents fichiers avec sudo).


3
2018-02-21 11:58





Essayez ce script python; il ne nécessite aucun processus de création et ne fait que deux appels système par fichier. Mis à part une implémentation en C, ce sera probablement le moyen le plus rapide de le faire (j'en avais besoin pour fixer un système de fichiers de 15 millions de fichiers qui étaient tous réglés sur 777)

#!/usr/bin/python3
import os
for par, dirs, files in os.walk('.'):
    for d in dirs:
        os.chmod(par + '/' + d, 0o755)
    for f in files:
        os.chmod(par + '/' + f, 0o644)

Dans mon cas, un try / catch a été nécessaire autour du dernier chmod, car la chmodding de certains fichiers spéciaux a échoué.


0
2018-03-26 04:37





Vous pouvez aussi utiliser tree:

tree -faid /your_directory | xargs -L1 -I{} sudo chmod +x {}

-1
2018-02-16 09:34





Vous pouvez utiliser le script bash suivant comme exemple. Assurez-vous de lui donner des autorisations exécutables (755). Utilisez simplement ./autochmod.sh pour le répertoire en cours ou ./autochmod.sh <dir> pour en spécifier un autre.

#!/bin/bash

if [ -e $1 ]; then
    if [ -d $1 ];then
        dir=$1
    else
        echo "No such directory: $1"
        exit
    fi
else
    dir="./"
fi

for f in $(ls -l $dir | awk '{print $8}'); do
    if [ -d $f ];then
        chmod 755 $f
    else
        chmod 644 $f
    fi
done

-2
2018-01-29 11:56



Hou la la! Tant de problèmes! (1) si $1 n'est pas null, mais n'est pas le nom d'un répertoire (par exemple, est une faute de frappe), puis dir se met à . sans message. (2) $1 devrait être "$1" et $dir devrait être "$dir". (3) Vous n'avez pas besoin de dire "./"; "." c'est bien (et à proprement parler, vous n'avez pas besoin de citations ici). (4) Ce n'est pas une solution récursive. (5) Sur mon système, ls -l … | awk '{ print $8 }' obtient les temps de modification des fichiers. Vous avez besoin { print $9 } obtenir le premier mot de le nom de fichier. Et même alors, (6) cela ne gère pas les noms de fichiers avec des espaces blancs. ... - Scott
... Et, last but not least (∞) si ce script est dans le répertoire courant, il sera chmod  lui-même à 644, se rendant ainsi non exécutable! - Scott