Comment chmod 755 tous les répertoires mais aucun fichier (récursivement)?
Inversement, comment chmod uniquement des fichiers (récursivement) mais pas de répertoire?
permissions
chmod
Olivier Lalonde
la source
la source
Réponses:
Pour donner récursivement aux répertoires des privilèges de lecture et d'exécution:
Pour donner récursivement aux fichiers des privilèges de lecture:
Ou, s'il y a beaucoup d'objets à traiter:
Ou, pour réduire le
chmod
frai:la source
-bash: /bin/chmod: Argument list too long
. La dernière commande fonctionne avec de nombreux fichiers, mais si vous en utilisezsudo
une, vous devez faire attention à la mettre avant xargs au lieu de chmod:find /path/to/base/dir -type d -print0 | sudo xargs -0 chmod 755
dir
sera également défini sur 755.chmod ... $(find /path/to/base/dir -type ...)
échoue pour les noms de fichiers avec des espaces dans le nom.find /path/to/base/dir -type d -exec chmod 755 {} \;
(find /path/to/base/dir -type f -exec chmod 644 {} \;
).Une raison commune pour ce genre de chose est de définir les répertoires sur 755 mais les fichiers sur 644. Dans ce cas, il existe un moyen légèrement plus rapide que l'
find
exemple de nik :Sens:
-R
= récursivement;u+rwX
= Les utilisateurs peuvent lire, écrire et exécuter.go+rX
= le groupe et les autres peuvent lire et exécuter;go-w
= le groupe et les autres ne peuvent pas écrireLa chose importante à noter ici est que les majuscules
X
agissent différemment des minusculesx
. Dans le manuel, nous pouvons lire: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.
la source
chmod -R 777
puisque l'+X
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 d'y descendre.X
, comme expliqué dans les commentaires.go+rX,go-w
->go=rX
n'est ce pas?chmod u-x,u+X
combinaison, etc., pour supprimer les bits d'exécution des fichiers, mais les ajouter pour les répertoires.Si vous voulez vous assurer que les fichiers sont définis sur 644 et que certains fichiers du chemin contiennent l'indicateur d'exécution, vous devez d'abord supprimer l'indicateur d'exécution. + X ne supprime pas l'indicateur d'exécution des fichiers qui l'ont déjà.
Exemple:
Mise à jour: cela semble échouer car la première modification (ugo-x) rend le répertoire non exécutable, de sorte que tous les fichiers qu'il contient ne sont pas modifiés.
la source
chmod -R ugo-x path
, cela pourrait être un problème. Mais la commande complète fera lechmod u+rwX
sur chaque répertoire avant d'essayer d'y descendre.) Cependant, je pense que celachmod R u=rw,go=r,a+X path
suffit - et que c'est plus court.J'ai décidé d'écrire un petit script pour cela moi-même.
Script chmod récursif pour les répertoires et / ou fichiers - Gist :
chmodr.sh
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 les exclut, 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 .
la source
Pour donner récursivement aux répertoires des privilèges de lecture et d'exécution:
Pour donner récursivement aux fichiers des privilèges de lecture:
Mieux vaut tard que de ne jamais me laisser améliorer la réponse de nik du point de vue de l'exactitude. Ma solution est plus lente, mais elle fonctionne avec n'importe quel nombre de fichiers, avec n'importe quel symbole dans les noms de fichiers, et vous pouvez l'exécuter avec sudo normalement (mais méfiez-vous, elle pourrait détecter différents fichiers avec sudo).
la source
Essayez ce script python; il ne nécessite aucune génération de processus 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 réparer un système de fichiers de 15 millions de fichiers, qui étaient tous définis à 777)
Dans mon cas, un try / catch était requis autour du dernier chmod, car certains fichiers spéciaux ont échoué.
la source
Vous pouvez également utiliser
tree
:et si vous souhaitez également afficher le dossier, ajoutez un écho
la source
xargs
problèmes. Les guillemets simples dans les noms de fichiers sont eux-mêmes un problème pour de nombreuses commandes et scripts, c'est pourquoi j'ai énuméré tous les fichiers contenant des guillemets simples et les ai supprimés (les guillemets que je veux dire)Vous pouvez utiliser le script bash suivant à titre d'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.
la source
$1
n'est pas null, mais n'est pas le nom d'un répertoire (par exemple, s'il s'agit d'une faute de frappe), ildir
est alors défini sur.
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 devez{ print $9 }
obtenir le premier mot du nom du fichier. Et même dans ce cas (6), cela ne gère pas les noms de fichiers avec des espaces. …chmod
lui - même à 644, se rendant ainsi non-exécutable!