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

2voto

ryan Points 523

Essayez ce ; il ne nécessite pas de lancement de processus et ne fait que deux syscalls par fichier. En dehors d'une implémentation en C, ce sera probablement la manière la plus rapide de le faire (j'en ai eu besoin pour réparer 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 était nécessaire autour du dernier chmod, car le chmodage de certains fichiers spéciaux a échoué.

1voto

Boop Points 156

Je poste ma solution car je ne vois pas de presque tous les solution de cas utilisant uniquement chmod :

Seulement chmod : permissions lisses sur les fichiers et répertoires

Pour mon exemple, j'ai créé plusieurs fichiers avec des permissions différentes :

> tree -p chmodtests/
chmodtests/
 [drwxr-xr-x]  aa/
    [drwxr-xr-x]  a1/
       [-r--r--r--]  read_only
       [-rw-rw-rw-]  read_w
       [-rwxrwxrwx]  read_wx*
    [drwxr-xr-x]  a2/
    [-r--------]  read_only
    [-rw-------]  read_w
    [-rwx------]  read_wx*
 [drwxr-xr-x]  bb/

4 directories, 6 files

puis appliquer cette commande :

chmod -vR a=r-wx,u=wr,a+X chmodtests/

sortie :

mode of 'chmodtests/' retained as 0755 (rwxr-xr-x)
mode of 'chmodtests/aa' retained as 0755 (rwxr-xr-x)
mode of 'chmodtests/aa/a1' retained as 0755 (rwxr-xr-x)
mode of 'chmodtests/aa/a1/read_only' changed from 0444 (r--r--r--) to 0644 (rw-r--r--)
mode of 'chmodtests/aa/a1/read_w' changed from 0666 (rw-rw-rw-) to 0644 (rw-r--r--)
mode of 'chmodtests/aa/a1/read_wx' changed from 0777 (rwxrwxrwx) to 0644 (rw-r--r--)
mode of 'chmodtests/aa/read_only' changed from 0400 (r--------) to 0644 (rw-r--r--)
mode of 'chmodtests/aa/a2' retained as 0755 (rwxr-xr-x)
mode of 'chmodtests/aa/read_w' changed from 0600 (rw-------) to 0644 (rw-r--r--)
mode of 'chmodtests/aa/read_wx' changed from 0700 (rwx------) to 0644 (rw-r--r--)
mode of 'chmodtests/bb' retained as 0755 (rwxr-xr-x)

résultat : tous les fichiers sont 644 ; tous les répertoires sont 755

> tree -p chmodtests/
chmodtests/
 [drwxr-xr-x]  aa/
    [drwxr-xr-x]  a1/
       [-rw-r--r--]  read_only
       [-rw-r--r--]  read_w
       [-rw-r--r--]  read_wx
    [drwxr-xr-x]  a2/
    [-rw-r--r--]  read_only
    [-rw-r--r--]  read_w
    [-rw-r--r--]  read_wx
 [drwxr-xr-x]  bb/

Partie explicative

explication tl;dr :

cette commande supprime toutes les exécutions/recherches sur les fichiers et les répertoires, puis ajoute des exécutions/recherches uniquement pour les répertoires.

chmod -vR : verbeux et récursif

a=r-wx :

  • a : sens tous ( utilisateur , groupe y autre )
  • = : définir les permissions sur (ne pas ajouter ni supprimer)
  • r-wx : autorisations en lecture seule

u=wr L'utilisateur peut lire et écrire

a+X : ajouter l'exécution/recherche uniquement pour les répertoires (pour tous les types u,g,o)

Autre exemple

Disons maintenant que je ne veux que 600 pour les fichiers et 700 pour les répertoires :

chmod -vR a=-rwx,u=rw,u+X chmodtests/

Limites

Avec cette méthode, vous ne pouvez pas définir r et w différemment pour les fichiers et les répertoires.

Par exemple, vous ne pouvez pas avoir les éléments suivants

drwxr-xr-x dir/
-r-------- dir/myfile

hth

0 votes

Mon choix particulier sur le partage Samba : (pour les fichiers cachés inclure : shopt -s dotglob ;) chmod -R a=-rwx,u=rw,g=rw,u+X,g+X *

-1voto

Eduard Florinescu Points 2616

Vous pouvez également utiliser tree :

tree -faid /your_directory | xargs -L1 -I{} bash -c 'sudo chmod 755 "$1"' -- '{}'

et si vous voulez également voir le dossier, ajoutez un écho

 tree -faid /your_directory | xargs -L1 -I{} bash -c 'sudo chmod 755 "$1" && echo$1' -- '{}'

0 votes

@Scott 1) Vous avez raison au sujet de +x que j'ai changé en 755 ; 2) 3) pour résoudre ce problème, j'ai mis le caractère de remplacement entre guillemets comme ceci '{}'.

0 votes

@Scott Je suis d'accord pour dire que ce n'est pas la meilleure réponse et qu'elle est lente, mais je vais la laisser ici à des fins "didactiques", et les commentaires expliqueront davantage, et les gens pourront apprendre sur xargs problèmes. Les guillemets simples dans les noms de fichiers sont eux-mêmes un problème pour de nombreuses commandes et script ; c'est pourquoi j'ai listé tous les fichiers contenant des guillemets simples et les ai supprimés (les guillemets je veux dire)

0 votes

@Scott Sur mes systèmes, j'ai recherché tous les fichiers contenant des guillemets simples et je les ai remplacés par des guillemets simples.

-2voto

user26528 Points 282

Vous pouvez utiliser le bash script< suivant comme exemple. Veillez à lui donner les droits d'exécution (755). Utilisez simplement ./autochmod.sh pour le répertoire courant, 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

3 votes

Wow ! Tant de problèmes ! (1) Si $1 n'est pas nul, mais n'est pas le nom d'un répertoire (par exemple, c'est une faute de frappe), alors dir est réglé sur . sans message. (2) $1 devrait être "$1" y $dir devrait être "$dir" . (3) Vous n'avez pas à dire "./" ; "." est très bien (et, strictement parlant, vous n'avez pas besoin de guillemets 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 } pour obtenir le premier mot de le nom du fichier. Et même là, (6) cela ne gère pas les noms de fichiers avec des espaces blancs.

2 votes

Et, last but not least () si ce script se trouve dans le répertoire courant, il va chmod lui-même à 644, se rendant ainsi non exécutable !

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