Je souhaite définir l'autorisation 755 sur tous les fichiers et sous-répertoires d'un répertoire spécifique, mais je souhaite exécuter chmod 755 uniquement pour les composants qui ne disposent pas de l'autorisation 755.
find /main_directory/ -exec chmod 755 {} \;
Si la find
commande renvoie une longue liste, cela prendra beaucoup de temps. Je sais que je peux utiliser la commande stat pour vérifier l'autorisation de niveau de fichier octal de chaque composant, puis utiliser if-else pour basculer l'autorisation de fichier, mais existe-t-il une approche sur une seule ligne utilisant find
et xargs
pour vérifier d'abord quelle autorisation le fichier / répertoire a , puis utilisez-le chmod
pour le remplacer par 755 s'il est défini sur autre chose.
command-line
find
chmod
Kumarjit Ghosh
la source
la source
u+rw,go+r,go-w,ugo+X
- notez la capitale.Réponses:
Si vous souhaitez modifier les autorisations
755
sur les fichiers et les répertoires, il n'y a aucun avantage réel à utiliserfind
(du moins du point de vue des performances), et vous pouvez simplement le faireSi vous voulez vraiment utiliser
find
pour éviter de modifier les autorisations sur des choses qui ont déjà des755
autorisations (pour éviter de mettre à jour leur horodatage ctime), vous devez également tester les autorisations actuelles sur chaque répertoire et fichier:Le
-exec ... {} +
recueille autant de chemins que possible qui réussit le! -perm 0755
test et les exécutechmod
tous en même temps.Habituellement, on voudrait changer les autorisations sur les fichiers et les répertoires séparément, afin que tous les fichiers ne soient pas exécutables:
la source
+
au lieu de;
fait une grande différence ici.Comme l'
find
a obtenu la-exec ... +
syntaxe, il n'y a pas grand intérêt à l'utiliserxargs
, mais comme vous le demandez:la source
-0
(en combinaison avec-print0
dans find; qui est l'extension GNU) peuvent être assez problématiques en termes de sécurité si un attaquant potentiel peut créer des noms de fichiers qui incluent des espaces ou d'autres caractères spéciaux. Il vaut donc mieux s'en tenir à-exec
quand vous le pouvezxargs
(juste utiliser-exec
), et si vous l'utilisez, vous devriez utiliser-print0
/-0
comme Matija le dit.