Comment chmod 755
tous les répertoires mais pas les fichiers (de manière récursive) ?
Inversement, comment chmod
seulement les fichiers (de manière récursive) mais pas les répertoires ?
Comment chmod 755
tous les répertoires mais pas les fichiers (de manière récursive) ?
Inversement, comment chmod
seulement les fichiers (de manière récursive) mais pas les répertoires ?
Pour donner récursivement répertoires privilèges de lecture et d'exécution :
find /path/to/base/dir -type d -exec chmod 755 {} +
Pour donner récursivement fichiers lire les privilèges :
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, pour 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
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 lorsqu'on utilise la commande sudo
on doit faire attention à le mettre avant xargs au lieu de chmod : find /path/to/base/dir -type d -print0 | sudo xargs -0 chmod 755
Il faut également noter que ces commandes sont inclusivement de la base dir. Donc dans l'exemple ci-dessus, dir
sera également fixé à 755.
chmod ... $(find /path/to/base/dir -type ...)
échoue pour les noms de fichiers avec des espaces dans le nom.
Une raison courante pour ce genre de chose est de définir les répertoires à 755 mais les fichiers à 644. Dans ce cas, il existe une méthode un peu plus rapide que celle de nik. find
exemple :
chmod -R u+rwX,go+rX,go-w /path
C'est-à-dire :
-R
= de manière récursive ;u+rwX
= Les utilisateurs peuvent lire, écrire et exécuter ;go+rX
= groupe et autres peuvent lire et exécuter ;go-w
= groupe et autres ne peuvent pas écrireLa chose importante à noter ici est que les majuscules X
agit différemment des minuscules x
. Dans le manuel, nous pouvons lire :
Les bits d'exécution/recherche si le fichier est un répertoire ou si l'un des bits d'exécution/recherche est défini dans le mode original (non modifié).
En d'autres termes, chmod u+X sur un fichier n'activera pas le bit execute ; et g+X ne l'activera que s'il est déjà activé pour l'utilisateur.
-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 écrire
Ce modèle n'arrangera pas la situation lorsque quelqu'un a fait chmod -R 777
depuis le +X
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.
Mais comment votre commande répond-elle à la question de l'OP : définir une ACL différente selon le fichier / répertoire ? Votre commande va définir les ACL indépendamment du fait qu'il s'agisse d'un répertoire ou d'un fichier.
Si vous voulez vous assurer que les fichiers sont définis sur 644 et qu'il y a des fichiers dans le chemin qui ont le drapeau d'exécution, vous devrez d'abord supprimer le drapeau d'exécution. +X ne supprime pas l'indicateur 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 parce que le premier changement (ugo-x) rend le répertoire non exécutable, donc tous les fichiers en dessous ne sont pas modifiés.
Cela fonctionne pour moi, et je ne vois pas pourquoi ce ne serait pas le cas. 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.
J'ai trouvé que cela fonctionnait correctement ; il n'y avait pas de problèmes avec la saisie des répertoires.
Pour donner récursivement répertoires privilèges de lecture et d'exécution :
find /path/to/base/dir -type d -exec chmod 755 {} \;
Pour donner récursivement fichiers lire les privilèges :
find /path/to/base/dir -type f -exec chmod 644 {} \;
Mieux vaut tard que jamais, permettez-moi d'améliorer la réponse de Nik du côté de l'exactitude. Ma solution est plus lente, mais elle fonctionne avec n'importe quel nombre de fichiers, avec n'importe quels symboles dans les noms de fichiers, et vous pouvez l'exécuter avec sudo normalement (mais attention, elle peut découvrir différents fichiers avec sudo).
Il s'agit d'un déclassement de réponse de nik . Pourquoi pensez-vous qu'il y a un problème avec la réponse de Nik ?
Je suis sûr à 99% que vous vous trompez. Pouvez-vous fournir des preuves à l'appui de votre affirmation ?
J'ai décidé d'écrire moi-même un petit script< pour cela.
Chmod récursif script pour les répertoires et/ou les fichiers - Gist :
chmodr.sh
#!/bin/sh
#
# chmodr.sh
#
# author: Francis Byrne
# date: 2011/02/12
#
# Generic Script for recursively setting permissions for directories and files
# to defined or default permissions using chmod.
#
# Takes a path to recurse through and options for specifying directory and/or
# file permissions.
# Outputs a list of affected directories and files.
#
# If no options are specified, it recursively resets all directory and file
# permissions to the default for most OSs (dirs: 755, files: 644).
# Usage message
usage()
{
echo "Usage: $0 PATH -d DIRPERMS -f FILEPERMS"
echo "Arguments:"
echo "PATH: path to the root directory you wish to modify permissions for"
echo "Options:"
echo " -d DIRPERMS, directory permissions"
echo " -f FILEPERMS, file permissions"
exit 1
}
# Check if user entered arguments
if [ $# -lt 1 ] ; then
usage
fi
# Get options
while getopts d:f: opt
do
case "$opt" in
d) DIRPERMS="$OPTARG";;
f) FILEPERMS="$OPTARG";;
\?) usage;;
esac
done
# Shift option index so that $1 now refers to the first argument
shift $(($OPTIND - 1))
# Default directory and file permissions, if not set on command line
if [ -z "$DIRPERMS" ] && [ -z "$FILEPERMS" ] ; then
DIRPERMS=755
FILEPERMS=644
fi
# Set the root path to be the argument entered by the user
ROOT=$1
# Check if the root path is a valid directory
if [ ! -d $ROOT ] ; then
echo "$ROOT does not exist or isn't a directory!" ; exit 1
fi
# Recursively set directory/file permissions based on the permission variables
if [ -n "$DIRPERMS" ] ; then
find $ROOT -type d -print0 | xargs -0 chmod -v $DIRPERMS
fi
if [ -n "$FILEPERMS" ] ; then
find $ROOT -type f -print0 | xargs -0 chmod -v $FILEPERMS
fi
Il fait essentiellement le chmod récursif mais fournit également un peu de flexibilité pour les options de la ligne de commande (définit les permissions du répertoire et/ou du fichier, ou exclut les deux, il réinitialise automatiquement tout à 755-644). Il vérifie également quelques scénarios d'erreur.
J'ai également écrit à ce sujet sur mon blog .
SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.
0 votes
En rapport : Changer les permissions de tous les fichiers et dossiers d'un répertoire en 644/755 à SO
0 votes
En rapport : Modifier les permissions de tous les dossiers avec une seule commande à l'U&L.