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 ?
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é.
Je poste ma solution car je ne vois pas de presque tous les solution de cas utilisant uniquement chmod
:
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/
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 seuleu=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)
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/
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
@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 '{}'.
@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)
@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.
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
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.
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.