732 votes

Comment chmoder récursivement tous les répertoires sauf les fichiers ?

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 ?

0 votes

0 votes

1020voto

Mark Points 251

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

17 votes

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

5 votes

Il faut également noter que ces commandes sont inclusivement de la base dir. Donc dans l'exemple ci-dessus, dir sera également fixé à 755.

4 votes

chmod ... $(find /path/to/base/dir -type ...) échoue pour les noms de fichiers avec des espaces dans le nom.

363voto

bobince Points 9446

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 écrire

La 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.

5 votes

-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

29 votes

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.

0 votes

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.

17voto

mpolden Points 169

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.

2 votes

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.

0 votes

J'ai trouvé que cela fonctionnait correctement ; il n'y avait pas de problèmes avec la saisie des répertoires.

0 votes

Neat, ça marche bien.

5voto

Peter K Points 339

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).

0 votes

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 ?

1 votes

@Scott, la réponse de nik échoue avec un (très) grand nombre de fichiers.

0 votes

Je suis sûr à 99% que vous vous trompez. Pouvez-vous fournir des preuves à l'appui de votre affirmation ?

4voto

francisbyrne Points 49

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 .

0 votes

Existe-t-il un moyen d'empêcher le dossier . d'obtenir un changement de permission ?

SistemesEz.com

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.

Powered by:

X