Voici un exemple de la manière dont je contournerais le problème en créant un fichier wrapper script pour les chgrp
commande agir sur une répertoire cible ayant des problèmes avec fichiers verrouillés .
L'utilisation d'un bash script , nommé chgrpld
je lui transmettrais les mêmes arguments de ligne de commande ( options , opérande y répertoire ) Je le ferais si l'exécution chgrp
sur un répertoire . Notez que ma convention de dénomination consistait simplement à ajouter les lettres ld
qui représente répertoire verrouillé En effet, il fonctionne sur répertoires qui sont verrouillé ou non, et ou contenant fichiers/répertoires qui sont verrouillé trop. Ainsi, là où j'utiliserais normalement, par exemple, chgrp -R staff foo
donde foo
est un répertoire J'utiliserais chgrpld -R staff foo
au lieu de cela. Les script est également codé pour fonctionner sur un répertoire c'est-à-dire non verrouillé et ou ne contient pas objets du système de fichiers verrouillés également, ce qui permet l'utilisation de chgrpld
en remplacement régulier de chgrp
lorsqu'il s'agit de cibler un répertoire Si je ne veux pas vérifier la présence de objets du système de fichiers verrouillés d'abord ou avoir chgrp
échoue d'abord pour devoir ensuite utiliser chgrpld
Quoi qu'il en soit.
Note : Cette script utilise un nombre limité de contrôles d'erreurs, suffisant pour fonctionner dans des conditions de test limitées. Il s'agit d'un contrôle d'erreur limité, suffisant pour fonctionner dans des conditions de test limitées. n'est pas codé pour gérer une nouvelle ligne intégrée dans le nom d'un objet du système de fichiers, qui IMO n'a pas sa place en premier lieu ! N'hésitez pas à modifier ce code pour l'adapter à vos besoins, en ajoutant des contrôles d'erreur supplémentaires si nécessaire.
L'environnement de test était OS X 10.11.5 dans un local temporaire. répertoire comme le montre la liste ci-dessous, avec deux répertoires , chacun avec un fichier en son sein et l'un des dossiers verrouillé. Un seul ensemble de répertoires/fichiers est dans la admin
groupe et l'autre fixer est dans la staff
groupe et je veux que tout soit dans la staff
groupe . (Voir la note sur les tests à la fin de la réponse pour des informations supplémentaires sur les tests).
La sortie du terminal montre :
- Un système récursif répertoire liste.
- Une tentative d'utiliser
chgrp
en affichant sa sortie d'erreur.
- Utilisation
chgrpld
s'exécutant sans erreur.
- Une autre méthode récursive répertoire pour montrer le groupe a changé.
$ ls -lRO
total 0
drwxr-xr-x 3 user staff - 102 Aug 9 2:00 bar
drwxr-xr-x 3 user admin - 102 Aug 9 2:00 foo
./bar:
total 0
-rw-r--r-- 1 user staff - 0 Aug 9 2:00 foo
./foo:
total 0
-rw-r--r-- 1 user admin uchg 0 Aug 9 2:00 bar
$ chgrp -R staff foo
chgrp: foo/bar: Operation not permitted
$ chgrpld -R staff foo
$ ls -lRO
total 0
drwxr-xr-x 3 user staff - 102 Aug 9 2:00 bar
drwxr-xr-x 3 user staff - 102 Aug 9 2:00 foo
./bar:
total 0
-rw-r--r-- 1 user staff - 0 Aug 9 2:00 foo
./foo:
total 0
-rw-r--r-- 1 user staff uchg 0 Aug 9 2:00 bar
$
Pour créer le chgrpld
bash script et le mettre à disposition au invite de commande :
En terminal :
- Type,
touch chgrpld
et appuyez sur enter .
- Type,
open chgrpld
et appuyez sur enter .
Depuis le navigateur :
- Copier-coller, le code ci-dessous dans l'espace ouvert
chgrpld
et l'enregistrer, puis fermer le fichier.
Retour au terminal :
- Type,
chmod +x chgrpld
et appuyez sur enter .
- Type,
sudo mkdir -p /usr/local/bin
et appuyez sur enter . Notez que sur une installation propre de OS X 10.11.5, l'option bin
à l'adresse /usr/local
n'existait pas alors qu'il est déjà dans le fichier PATH
.
- Type dans mot de passe et appuyez sur enter .
- Type
sudo cp chgrpld /usr/local/bin
et appuyez sur enter .
- Type dans mot de passe et appuyez sur enter . (si nécessaire).
-
chgrpld
devrait maintenant être disponible, tout comme la fonction chgrp
commande .
Source code pour chgrpld
:
#!/bin/bash
o="${@:1:$(($#-1))}"
d="${@: -1}"
if [ -d "$d" ]; then
f=".locked_files_list_$(date "+%s")"
find "$d" -flags uchg > "$f" 2>/dev/null
if [ -s "$f" ]; then
while read -r l; do
chflags nouchg "$l"
done<"$f"
$(chgrp $o "$d")
while read -r l; do
chflags uchg "$l"
done<"$f"
rm "$f"
else
rm "$f"
$(chgrp $o "$d")
fi
else
echo " \"$d\" is not a directory!..."
exit 1
fi
exit 0
Synopsis : chgrpld [fhv][R[H | L | P]] group directory
-
Voir man chgrp
dans le terminal pour la description de la options y group
opérande .
-
directory
est le nom/nom de famille de la cible répertoire c'est-à-dire verrouillé ou non, et ou contenant fichiers/répertoires qui sont verrouillé aussi. Il convient de noter que, contrairement aux chgrp
qui permet à plusieurs objets , par exemple group file ...
d'agir, chgrpld
est codé pour agir sur une cible répertoire et de manière récursive avec le -R
option à la fois.
-
Note : L'utilisateur qui invoque chgrpld doit appartenir à la catégorie groupe et être le propriétaire de la répertoire y objets du système de fichiers verrouillés ou être le super-utilisateur .
-
Comme prévu dans les versions SIP du système d'exploitation, cela ne fonctionnera pas si le système est protégé par SIP. objets du système de fichiers si SIP est activé.
L'image ci-dessous montre la mise en évidence syntaxique de l'élément code avec des commentaires espacés et indentés pour faciliter la lecture et expliquer un peu ce qu'est la code est en train de faire.
Note de test : Bien que l'environnement de test présenté ci-dessus soit limité, je l'ai néanmoins testé dans une structure de répertoires hiérarchique plus complexe, avec beaucoup plus de répertoires et de fichiers imbriqués verrouillés, avec des noms contenant des espaces ou des barres obliques inverses dans le nom du fichier, sans aucun problème. Évidemment, à des fins de démonstration, je ne montre qu'une structure minimale pour prouver le concept. Encore une fois, comme indiqué ci-dessus, " Il n'est pas codé pour gérer une nouvelle ligne intégrée dans le nom d'un objet du système de fichiers, qui n'a pas sa place en premier lieu ! ".