El siguiente es un ejemplo de cómo solucionaría el problema creando un wrapper script para el chgrp
comando para actuar sobre un directorio de destino teniendo problemas con archivos bloqueados .
Utilizando un bash script , llamado chgrpld
le pasaría los mismos argumentos de la línea de comandos ( opciones , operando y directorio ) Lo haría si ejecutara chgrp
en un directorio . Tenga en cuenta que mi convención de nomenclatura era simplemente añadir las letras ld
a ella representando directorio bloqueado en el sentido de que funciona en directorios que son bloqueado o no, y o que contenga archivos/directorios que son bloqueado también. Así que donde normalmente usaría, por ejemplo, chgrp -R staff foo
, donde foo
es un directorio , yo usaría chgrpld -R staff foo
en su lugar. El script también está codificado para funcionar en un directorio es decir no bloqueado y o no contiene objetos del sistema de archivos bloqueados también, permitiendo así el uso de chgrpld
como un reemplazo regular de chgrp
cuando se dirige a un directorio , si no quiero comprobar objetos del sistema de archivos bloqueados primero o tener chgrp
fallar primero para luego tener que usar chgrpld
de todos modos.
Nota: Este script emplea una cantidad limitada de comprobación de errores, suficiente para funcionar en condiciones de prueba limitadas. Se puede consultar en no es codificado para manejar una nueva línea incrustada en el nombre de un objeto del sistema de archivos, que, en primer lugar, no debe estar ahí. Siéntase libre de modificar como sea necesario/querido para satisfacer sus necesidades, añadiendo una comprobación de errores adicional si/cuando se quiera/necesite.
El entorno de prueba fue OS X 10.11.5 en un directorio como se muestra en el siguiente listado, teniendo dos directorios Cada uno de ellos con una archivo en él y uno de los archivos bloqueado. Un conjunto de directorios/archivos está en el admin
grupo y el otro set está en el staff
grupo y quiero que todo esté en el staff
grupo . (Véase la nota de la prueba al final de la respuesta para obtener información adicional sobre la prueba).
La salida del terminal muestra:
- Una recursividad directorio de la lista.
- Un intento de utilizar
chgrp
mostrando su salida de error.
- Utilizando
chgrpld
ejecutándose sin error.
- Otra recursividad directorio para mostrar el grupo ha cambiado.
$ 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
$
Para crear el chgrpld
bash script y tenerlo disponible en el indicador de comandos :
En la terminal:
- Tipo,
touch chgrpld
y pulse enter .
- Tipo,
open chgrpld
y pulse enter .
Desde el navegador:
- Copiar y pegar, el código abajo en el abierto
chgrpld
y guárdelo, luego cierre el archivo.
De vuelta a la terminal:
- Tipo,
chmod +x chgrpld
y pulse enter .
- Tipo,
sudo mkdir -p /usr/local/bin
y pulse enter . Tenga en cuenta que en una instalación limpia de OS X 10.11.5, el bin
directorio en /usr/local
no existía aunque ya está en el PATH
.
- Escriba contraseña y pulse enter .
- Tipo
sudo cp chgrpld /usr/local/bin
y pulse enter .
- Escriba contraseña y pulse enter . (Si es necesario.)
chgrpld
debería estar ahora disponible para su uso, al igual que el chgrp
comando .
Fuente código para 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
Sinopsis: chgrpld [fhv][R[H | L | P]] group directory
-
Ver man chgrp
en Terminal para la descripción de opciones y group
operando .
-
directory
es el nombre/patrón del objetivo directorio es decir bloqueado o no, y o que contenga archivos/directorios que son bloqueado también. Tenga en cuenta que, a diferencia de chgrp
lo que permite múltiples objetos Por ejemplo group file ...
para actuar, chgrpld
está codificado para actuar sobre un objetivo directorio y recursivamente con el -R
opción a la vez.
-
Nota: El usuario que invoca chgrpld debe pertenecer al grupo y ser el propietario de la directorio y objetos del sistema de archivos bloqueados o ser el superusuario .
-
Como es de esperar en las versiones SIP del sistema operativo, esto no funcionará en las versiones protegidas por SIP objetos del sistema de archivos si el SIP está activado.
La siguiente imagen muestra el resaltado sintáctico del código con comentarios espaciados y sangrados para facilitar la lectura y ayudar a explicar un poco lo que el código está haciendo.
Nota de prueba: Aunque el entorno de prueba mostrado arriba es limitado, lo probé bajo una estructura jerárquica de directorios más compleja, con muchos más directorios y archivos anidados y bloqueados, con nombres que contienen espacios o barras invertidas dentro del nombre del archivo, sin problemas. Obviamente, para fines de demostración, sólo estoy mostrando una estructura mínima para probar el concepto. Una vez más, como se señaló anteriormente, " Es no es codificado para manejar una nueva línea incrustada en el nombre de un objeto del sistema de archivos, que, en primer lugar, no debe estar ahí. ".